You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by ki...@apache.org on 2013/07/20 18:22:11 UTC
svn commit: r1505160 - in
/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs: ./
src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/
src/main/java/org/apache/hadoop/hdfs/server/namenode/
Author: kihwal
Date: Sat Jul 20 16:22:11 2013
New Revision: 1505160
URL: http://svn.apache.org/r1505160
Log:
HDFS-5010. Reduce the frequency of getCurrentUser() calls from namenode. Contributed by Kihwal Lee.
Modified:
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Sat Jul 20 16:22:11 2013
@@ -3276,6 +3276,9 @@ Release 0.23.10 - UNRELEASED
IMPROVEMENTS
+ HDFS-5010. Reduce the frequency of getCurrentUser() calls from namenode
+ (kihwal)
+
OPTIMIZATIONS
BUG FIXES
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java Sat Jul 20 16:22:11 2013
@@ -860,8 +860,10 @@ public class BlockManager {
public void setBlockToken(final LocatedBlock b,
final BlockTokenSecretManager.AccessMode mode) throws IOException {
if (isBlockTokenEnabled()) {
- b.setBlockToken(blockTokenSecretManager.generateToken(b.getBlock(),
- EnumSet.of(mode)));
+ // Use cached UGI if serving RPC calls.
+ b.setBlockToken(blockTokenSecretManager.generateToken(
+ NameNode.getRemoteUser().getShortUserName(),
+ b.getBlock(), EnumSet.of(mode)));
}
}
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Sat Jul 20 16:22:11 2013
@@ -168,6 +168,7 @@ import org.apache.hadoop.hdfs.server.com
import org.apache.hadoop.hdfs.server.namenode.INode.BlocksMapUpdateInfo;
import org.apache.hadoop.hdfs.server.namenode.JournalSet.JournalAndStream;
import org.apache.hadoop.hdfs.server.namenode.LeaseManager.Lease;
+import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.hdfs.server.namenode.NameNode.OperationCategory;
import org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase;
import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgress;
@@ -2943,7 +2944,11 @@ public class FSNamesystem implements Nam
private FSPermissionChecker getPermissionChecker()
throws AccessControlException {
- return new FSPermissionChecker(fsOwnerShortUserName, supergroup);
+ try {
+ return new FSPermissionChecker(fsOwnerShortUserName, supergroup, getRemoteUser());
+ } catch (IOException ioe) {
+ throw new AccessControlException(ioe);
+ }
}
/**
* Remove a file/directory from the namespace.
@@ -3153,9 +3158,7 @@ public class FSNamesystem implements Nam
return !INodeFile.valueOf(dir.getINode(src), src).isUnderConstruction();
} catch (AccessControlException e) {
if (isAuditEnabled() && isExternalInvocation()) {
- logAuditEvent(false, UserGroupInformation.getCurrentUser(),
- getRemoteIp(),
- "isFileClosed", src, null, null);
+ logAuditEvent(false, "isFileClosed", src);
}
throw e;
} finally {
@@ -5825,11 +5828,7 @@ public class FSNamesystem implements Nam
// optimize ugi lookup for RPC operations to avoid a trip through
// UGI.getCurrentUser which is synch'ed
private static UserGroupInformation getRemoteUser() throws IOException {
- UserGroupInformation ugi = null;
- if (Server.isRpcInvocation()) {
- ugi = Server.getRemoteUser();
- }
- return (ugi != null) ? ugi : UserGroupInformation.getCurrentUser();
+ return NameNode.getRemoteUser();
}
/**
@@ -6334,8 +6333,7 @@ public class FSNamesystem implements Nam
readLock();
try {
checkOperation(OperationCategory.READ);
- FSPermissionChecker checker = new FSPermissionChecker(
- fsOwner.getShortUserName(), supergroup);
+ FSPermissionChecker checker = getPermissionChecker();
final String user = checker.isSuperUser()? null : checker.getUser();
status = snapshotManager.getSnapshottableDirListing(user);
} finally {
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java Sat Jul 20 16:22:11 2013
@@ -56,14 +56,10 @@ class FSPermissionChecker {
/** A set with group namess. Not synchronized since it is unmodifiable */
private final Set<String> groups;
private final boolean isSuper;
-
- FSPermissionChecker(String fsOwner, String supergroup
- ) throws AccessControlException{
- try {
- ugi = UserGroupInformation.getCurrentUser();
- } catch (IOException e) {
- throw new AccessControlException(e);
- }
+
+ FSPermissionChecker(String fsOwner, String supergroup,
+ UserGroupInformation callerUgi) {
+ ugi = callerUgi;
HashSet<String> s = new HashSet<String>(Arrays.asList(ugi.getGroupNames()));
groups = Collections.unmodifiableSet(s);
user = ugi.getShortUserName();
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java Sat Jul 20 16:22:11 2013
@@ -431,6 +431,15 @@ public class NameNode {
return nodeRegistration;
}
+ /* optimize ugi lookup for RPC operations to avoid a trip through
+ * UGI.getCurrentUser which is synch'ed
+ */
+ public static UserGroupInformation getRemoteUser() throws IOException {
+ UserGroupInformation ugi = Server.getRemoteUser();
+ return (ugi != null) ? ugi : UserGroupInformation.getCurrentUser();
+ }
+
+
/**
* Login as the configured user for the NameNode.
*/
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java?rev=1505160&r1=1505159&r2=1505160&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java Sat Jul 20 16:22:11 2013
@@ -89,6 +89,7 @@ import org.apache.hadoop.hdfs.security.t
import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NamenodeRole;
import org.apache.hadoop.hdfs.server.common.IncorrectVersionException;
+import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.hdfs.server.namenode.NameNode.OperationCategory;
import org.apache.hadoop.hdfs.server.namenode.metrics.NameNodeMetrics;
import org.apache.hadoop.hdfs.server.namenode.web.resources.NamenodeWebHdfsMethods;
@@ -349,6 +350,11 @@ class NameNodeRpcServer implements Namen
return clientRpcAddress;
}
+ private static UserGroupInformation getRemoteUser() throws IOException {
+ return NameNode.getRemoteUser();
+ }
+
+
/////////////////////////////////////////////////////
// NamenodeProtocol
/////////////////////////////////////////////////////
@@ -457,7 +463,7 @@ class NameNodeRpcServer implements Namen
+ MAX_PATH_LENGTH + " characters, " + MAX_PATH_DEPTH + " levels.");
}
HdfsFileStatus fileStatus = namesystem.startFile(src, new PermissionStatus(
- UserGroupInformation.getCurrentUser().getShortUserName(), null, masked),
+ getRemoteUser().getShortUserName(), null, masked),
clientName, clientMachine, flag.get(), createParent, replication,
blockSize);
metrics.incrFilesCreated();
@@ -690,7 +696,7 @@ class NameNodeRpcServer implements Namen
+ MAX_PATH_LENGTH + " characters, " + MAX_PATH_DEPTH + " levels.");
}
return namesystem.mkdirs(src,
- new PermissionStatus(UserGroupInformation.getCurrentUser().getShortUserName(),
+ new PermissionStatus(getRemoteUser().getShortUserName(),
null, masked), createParent);
}
@@ -882,7 +888,7 @@ class NameNodeRpcServer implements Namen
if ("".equals(target)) {
throw new IOException("Invalid symlink target");
}
- final UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
+ final UserGroupInformation ugi = getRemoteUser();
namesystem.createSymlink(target, link,
new PermissionStatus(ugi.getShortUserName(), null, dirPerms), createParent);
}
@@ -1017,7 +1023,7 @@ class NameNodeRpcServer implements Namen
@Override // RefreshAuthorizationPolicyProtocol
public void refreshUserToGroupsMappings() throws IOException {
LOG.info("Refreshing all user-to-groups mappings. Requested by user: " +
- UserGroupInformation.getCurrentUser().getShortUserName());
+ getRemoteUser().getShortUserName());
Groups.getUserToGroupsMappingService().refresh();
}