Bläddra i källkod

HDFS-3062. Fix bug which prevented MR job submission from creating delegation tokens on an HA cluster. Contributed by Mingjie Lai.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1301285 13f79535-47bb-0310-9956-ffa450edef68
Todd Lipcon 13 år sedan
förälder
incheckning
49619e8997

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -306,6 +306,9 @@ Release 0.23.3 - UNRELEASED
     HDFS-3099. SecondaryNameNode does not properly initialize metrics system.
     (atm)
 
+    HDFS-3062. Fix bug which prevented MR job submission from creating
+    delegation tokens on an HA cluster. (Mingjie Lai via todd)
+
   BREAKDOWN OF HDFS-1623 SUBTASKS
 
     HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd)

+ 14 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java

@@ -840,4 +840,18 @@ public class DistributedFileSystem extends FileSystem {
   public void setBalancerBandwidth(long bandwidth) throws IOException {
     dfs.setBalancerBandwidth(bandwidth);
   }
+
+  /**
+   * Get a canonical service name for this file system. If the URI is logical,
+   * the hostname part of the URI will be returned.
+   * @return a service string that uniquely identifies this file system.
+   */
+  @Override
+  public String getCanonicalServiceName() {
+    if (HAUtil.isLogicalUri(getConf(), getUri())) {
+      return getUri().getHost();
+    } else {
+      return super.getCanonicalServiceName();
+    }
+  }
 }

+ 11 - 0
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java

@@ -204,6 +204,17 @@ public class TestDelegationTokensWithHA {
     assertArrayEquals(token.getIdentifier(), token2.getIdentifier());
     assertArrayEquals(token.getPassword(), token2.getPassword());
   }
+
+  /**
+   * HDFS-3062: DistributedFileSystem.getCanonicalServiceName() throws an
+   * exception if the URI is a logical URI. This bug fails the combination of
+   * ha + mapred + security.
+   */
+  @Test
+  public void testDFSGetCanonicalServiceName() throws Exception {
+    assertEquals(fs.getCanonicalServiceName(), 
+        HATestUtil.getLogicalUri(cluster).getHost());
+  }
   
   enum TokenTestAction {
     RENEW, CANCEL;