From 72406e940a4cdf2d1422fc00fec942b62d84a913 Mon Sep 17 00:00:00 2001 From: Todd Lipcon Date: Thu, 12 Apr 2012 18:08:00 +0000 Subject: [PATCH] HDFS-3255. HA DFS returns wrong token service. Contributed by Daryn Sharp. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1325414 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 ++ .../apache/hadoop/hdfs/DistributedFileSystem.java | 5 +++-- .../namenode/ha/TestDelegationTokensWithHA.java | 15 +++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 442a446aa7..be47dcf980 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -501,6 +501,8 @@ Release 2.0.0 - UNRELEASED HDFS-3260. TestDatanodeRegistration should set minimum DN version in addition to minimum NN version. (atm) + HDFS-3255. HA DFS returns wrong token service (Daryn Sharp via todd) + BREAKDOWN OF HDFS-1623 SUBTASKS HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java index 5c63d6a27f..d335aa8b71 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java @@ -848,8 +848,9 @@ public void setBalancerBandwidth(long bandwidth) throws IOException { */ @Override public String getCanonicalServiceName() { - if (HAUtil.isLogicalUri(getConf(), getUri())) { - return getUri().getHost(); + URI uri = getUri(); + if (HAUtil.isLogicalUri(getConf(), uri)) { + return HAUtil.buildTokenServiceForLogicalUri(uri).toString(); } else { return super.getCanonicalServiceName(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java index 60481af5db..f7755814c4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java @@ -42,6 +42,7 @@ import org.apache.hadoop.hdfs.server.namenode.NameNode; import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter; import org.apache.hadoop.io.Text; +import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.security.token.TokenIdentifier; @@ -196,8 +197,7 @@ public void testHAUtilClonesDelegationTokens() throws Exception { // check that the token selected for one of the physical IPC addresses // matches the one we received InetSocketAddress addr = nn0.getNameNodeAddress(); - Text ipcDtService = new Text( - addr.getAddress().getHostAddress() + ":" + addr.getPort()); + Text ipcDtService = SecurityUtil.buildTokenService(addr); Token token2 = DelegationTokenSelector.selectHdfsDelegationToken(ipcDtService, ugi); assertNotNull(token2); @@ -212,8 +212,15 @@ public void testHAUtilClonesDelegationTokens() throws Exception { */ @Test public void testDFSGetCanonicalServiceName() throws Exception { - assertEquals(fs.getCanonicalServiceName(), - HATestUtil.getLogicalUri(cluster).getHost()); + URI hAUri = HATestUtil.getLogicalUri(cluster); + String haService = HAUtil.buildTokenServiceForLogicalUri(hAUri).toString(); + assertEquals(haService, dfs.getCanonicalServiceName()); + Token token = dfs.getDelegationToken( + UserGroupInformation.getCurrentUser().getShortUserName()); + assertEquals(haService, token.getService().toString()); + // make sure the logical uri is handled correctly + token.renew(dfs.getConf()); + token.cancel(dfs.getConf()); } enum TokenTestAction {