Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Token.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Token.java (revision 1617429) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Token.java (working copy) @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.api.records; +import java.net.InetSocketAddress; import java.nio.ByteBuffer; import org.apache.hadoop.classification.InterfaceAudience.Private; @@ -94,4 +95,15 @@ @Unstable public abstract void setService(String service); + /** + * Get the service address which allocates the token. + * @return service to which the token is allocated + */ + @Public + @Stable + public abstract InetSocketAddress getServiceAddress(); + + @Private + @Unstable + public abstract void setServiceAddress(InetSocketAddress serviceAddr); } Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java (revision 1617429) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java (working copy) @@ -24,12 +24,12 @@ import static org.junit.Assert.fail; import java.io.IOException; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Assert; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ha.ClientBaseWithFixes; import org.apache.hadoop.ha.HAServiceProtocol; @@ -706,6 +706,7 @@ String password = "fake token passwd"; Token token = Token.newInstance( identifier.getBytes(), " ", password.getBytes(), " "); + token.setServiceAddress(new InetSocketAddress("localhost", 8080)); return token; } Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java (revision 1617429) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java (working copy) @@ -124,11 +124,13 @@ Closeable { private ApplicationClientProtocolPB proxy; + private InetSocketAddress serviceAddr; public ApplicationClientProtocolPBClientImpl(long clientVersion, InetSocketAddress addr, Configuration conf) throws IOException { RPC.setProtocolEngine(conf, ApplicationClientProtocolPB.class, ProtobufRpcEngine.class); + serviceAddr = addr; proxy = RPC.getProxy(ApplicationClientProtocolPB.class, clientVersion, addr, conf); } @@ -279,8 +281,10 @@ GetDelegationTokenRequestProto requestProto = ((GetDelegationTokenRequestPBImpl) request).getProto(); try { - return new GetDelegationTokenResponsePBImpl(proxy.getDelegationToken( - null, requestProto)); + GetDelegationTokenResponse rsp = new GetDelegationTokenResponsePBImpl + (proxy.getDelegationToken(null, requestProto)); + rsp.getRMDelegationToken().setServiceAddress(serviceAddr); + return rsp; } catch (ServiceException e) { RPCUtil.unwrapAndThrowException(e); return null; Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/TokenPBImpl.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/TokenPBImpl.java (revision 1617429) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/TokenPBImpl.java (working copy) @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.api.records.impl.pb; +import java.net.InetSocketAddress; import java.nio.ByteBuffer; import org.apache.hadoop.classification.InterfaceAudience.Private; @@ -37,7 +38,8 @@ private ByteBuffer identifier; private ByteBuffer password; - + private InetSocketAddress serviceAddr = null; + public TokenPBImpl() { builder = TokenProto.newBuilder(); } @@ -182,6 +184,16 @@ } @Override + public synchronized InetSocketAddress getServiceAddress() { + return serviceAddr; + } + + @Override + public synchronized void setServiceAddress(InetSocketAddress addr) { + serviceAddr = addr; + } + + @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Token { "); Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java (revision 1617429) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java (working copy) @@ -23,6 +23,7 @@ import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.util.EnumSet; import java.util.HashMap; @@ -85,6 +86,8 @@ 'a' + rand.nextInt(26), 'a' + rand.nextInt(26), 'a' + rand.nextInt(26)); + } else if (type.equals(InetSocketAddress.class)) { + return new InetSocketAddress("localhost", 8080); } else if (type instanceof Class) { Class clazz = (Class)type; if (clazz.isArray()) { @@ -122,8 +125,8 @@ Map map = Maps.newHashMap(); map.put(genTypeValue(params[0]), genTypeValue(params[1])); ret = map; - } - } + } + } if (ret == null) { throw new IllegalArgumentException("type " + type + " is not supported"); } @@ -246,6 +249,12 @@ if (name.equals("getProto")) { continue; } + // ServiceAddress property is not present in TokenProto hence + // needs to be bypassed + if(name.equals("getServiceAddress") && + recordClass.equals(TokenPBImpl.class)) { + continue; + } if ((name.length() > 3) && name.startsWith("get") && (m.getParameterTypes().length == 0)) { String propertyName = name.substring(3);