Bläddra i källkod

HDFS-17793. [ARR] RBF: Enable the router asynchronous RPC feature to handle DelegationToken request errors. (#7714). Contributed by zhangxiping1.

Reviewed-by: Jian Zhang <keepromise@apache.org>
章锡平 1 månad sedan
förälder
incheckning
3bd3bf86e7

+ 4 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClientProtocol.java

@@ -2524,4 +2524,8 @@ public class RouterClientProtocol implements ClientProtocol {
   public RouterFederationRename getRbfRename() {
     return rbfRename;
   }
+
+  public RouterSecurityManager getSecurityManager() {
+    return securityManager;
+  }
 }

+ 27 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/async/RouterAsyncClientProtocol.java

@@ -37,6 +37,7 @@ import org.apache.hadoop.hdfs.protocol.LastBlockWithStatus;
 import org.apache.hadoop.hdfs.protocol.ReplicatedBlockStats;
 import org.apache.hadoop.hdfs.protocol.RollingUpgradeInfo;
 import org.apache.hadoop.hdfs.protocol.UnresolvedPathException;
+import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier;
 import org.apache.hadoop.hdfs.server.federation.resolver.ActiveNamenodeResolver;
 import org.apache.hadoop.hdfs.server.federation.resolver.FederationNamespaceInfo;
 import org.apache.hadoop.hdfs.server.federation.resolver.FileSubclusterResolver;
@@ -60,7 +61,9 @@ import org.apache.hadoop.hdfs.server.federation.store.records.MountTable;
 import org.apache.hadoop.hdfs.server.namenode.NameNode;
 import org.apache.hadoop.hdfs.server.protocol.DatanodeStorageReport;
 import org.apache.hadoop.io.EnumSetWritable;
+import org.apache.hadoop.io.Text;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.util.Time;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1166,4 +1169,28 @@ public class RouterAsyncClientProtocol extends RouterClientProtocol {
     return asyncReturn(Path.class);
   }
 
+  @Override
+  public Token<DelegationTokenIdentifier> getDelegationToken(Text renewer)
+      throws IOException {
+    rpcServer.checkOperation(NameNode.OperationCategory.WRITE, true);
+    asyncComplete(getSecurityManager().getDelegationToken(renewer));
+    return asyncReturn(Token.class);
+  }
+
+  @Override
+  public long renewDelegationToken(Token<DelegationTokenIdentifier> token)
+      throws IOException {
+    rpcServer.checkOperation(NameNode.OperationCategory.WRITE, true);
+    asyncComplete(getSecurityManager().renewDelegationToken(token));
+    return asyncReturn(Long.class);
+  }
+
+  @Override
+  public void cancelDelegationToken(Token<DelegationTokenIdentifier> token)
+      throws IOException {
+    rpcServer.checkOperation(NameNode.OperationCategory.WRITE, true);
+    getSecurityManager().cancelDelegationToken(token);
+    asyncComplete(null);
+  }
+
 }

+ 9 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/async/TestRouterAsyncRpc.java

@@ -36,6 +36,7 @@ import static org.apache.hadoop.hdfs.server.federation.router.RBFConfigKeys.DFS_
 import static org.apache.hadoop.hdfs.server.federation.router.RBFConfigKeys.DFS_ROUTER_FAIRNESS_POLICY_CONTROLLER_CLASS;
 import static org.apache.hadoop.hdfs.server.federation.router.async.utils.AsyncUtil.syncReturn;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 /**
@@ -89,4 +90,12 @@ public class TestRouterAsyncRpc extends TestRouterRpc {
   public void testConcurrentCallExecutorInitial() {
     assertNull(rndRouter.getRouterRpcClient().getExecutorService());
   }
+
+  @Test
+  public void testGetDelegationTokenAsyncRpc() throws Exception {
+    UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
+    assertDoesNotThrow(() -> {
+      rndRouter.getFileSystem().getDelegationToken(ugi.getShortUserName());
+    });
+  }
 }