From 2e4cf977aea30c2a8b35be4eb876874e0055e5f4 Mon Sep 17 00:00:00 2001 From: Eli Collins Date: Mon, 6 Feb 2012 08:24:11 +0000 Subject: [PATCH] HDFS-2752. HA: exit if multiple shared dirs are configured. Contributed by Eli Collins git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-1623@1240916 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-hdfs/CHANGES.HDFS-1623.txt | 2 ++ .../hdfs/server/namenode/FSNamesystem.java | 15 ++++++++-- .../apache/hadoop/hdfs/MiniDFSCluster.java | 2 +- .../server/namenode/TestFSNamesystem.java | 3 +- .../namenode/ha/TestFailureOfSharedDir.java | 28 +++++++++++++++++-- .../namenode/ha/TestHAConfiguration.java | 3 +- 6 files changed, 45 insertions(+), 8 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-1623.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-1623.txt index 7b7deca917..627c6caeeb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-1623.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-1623.txt @@ -170,3 +170,5 @@ HDFS-2792. Make fsck work. (atm) HDFS-2808. HA: haadmin should use namenode ids. (eli) HDFS-2819. Document new HA-related configs in hdfs-default.xml. (eli) + +HDFS-2752. HA: exit if multiple shared dirs are configured. (eli) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 58584be291..13cb6536b0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -683,17 +683,28 @@ public class FSNamesystem implements Namesystem, FSClusterStats, * are ordered before non-shared directories, and any duplicates * are removed. The order they are specified in the configuration * is retained. + * @return Collection of shared edits directories. + * @throws IOException if multiple shared edits directories are configured */ - public static List getNamespaceEditsDirs(Configuration conf) { + public static List getNamespaceEditsDirs(Configuration conf) + throws IOException { // Use a LinkedHashSet so that order is maintained while we de-dup // the entries. LinkedHashSet editsDirs = new LinkedHashSet(); + List sharedDirs = getSharedEditsDirs(conf); + + // Fail until multiple shared edits directories are supported (HDFS-2782) + if (sharedDirs.size() > 1) { + throw new IOException( + "Multiple shared edits directories are not yet supported"); + } + // First add the shared edits dirs. It's critical that the shared dirs // are added first, since JournalSet syncs them in the order they are listed, // and we need to make sure all edits are in place in the shared storage // before they are replicated locally. See HDFS-2874. - for (URI dir : getSharedEditsDirs(conf)) { + for (URI dir : sharedDirs) { if (!editsDirs.add(dir)) { LOG.warn("Edits URI " + dir + " listed multiple times in " + DFS_NAMENODE_SHARED_EDITS_DIR_KEY + ". Ignoring duplicates."); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/MiniDFSCluster.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/MiniDFSCluster.java index c7dea88ed8..9f969477d1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/MiniDFSCluster.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/MiniDFSCluster.java @@ -1594,7 +1594,7 @@ public class MiniDFSCluster { /** * Get the directories where the namenode stores its edits. */ - public Collection getNameEditsDirs(int nnIndex) { + public Collection getNameEditsDirs(int nnIndex) throws IOException { return FSNamesystem.getNamespaceEditsDirs(nameNodes[nnIndex].conf); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java index d79f583efd..de3a89c083 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hdfs.server.namenode; import static org.apache.hadoop.hdfs.DFSConfigKeys.*; import static org.junit.Assert.*; +import java.io.IOException; import java.net.URI; import java.util.Collection; @@ -33,7 +34,7 @@ public class TestFSNamesystem { * Tests that the namenode edits dirs are gotten with duplicates removed */ @Test - public void testUniqueEditDirs() { + public void testUniqueEditDirs() throws IOException { Configuration config = new Configuration(); config.set(DFS_NAMENODE_EDITS_DIR_KEY, "file://edits/dir, " diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestFailureOfSharedDir.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestFailureOfSharedDir.java index 1a4e797cc8..84d45c0591 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestFailureOfSharedDir.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestFailureOfSharedDir.java @@ -68,6 +68,29 @@ public class TestFailureOfSharedDir { requiredEditsDirs.contains(bar)); } + /** + * Multiple shared edits directories is an invalid configuration. + */ + @Test + public void testMultipleSharedDirsFails() throws Exception { + Configuration conf = new Configuration(); + URI sharedA = new URI("file:///shared-A"); + URI sharedB = new URI("file:///shared-B"); + URI localA = new URI("file:///local-A"); + + conf.set(DFSConfigKeys.DFS_NAMENODE_SHARED_EDITS_DIR_KEY, + Joiner.on(",").join(sharedA,sharedB)); + conf.set(DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY, + localA.toString()); + + try { + FSNamesystem.getNamespaceEditsDirs(conf); + fail("Allowed multiple shared edits directories"); + } catch (IOException ioe) { + assertEquals("Multiple shared edits directories are not yet supported", + ioe.getMessage()); + } + } /** * Make sure that the shared edits dirs are listed before non-shared dirs @@ -78,13 +101,12 @@ public class TestFailureOfSharedDir { public void testSharedDirsComeFirstInEditsList() throws Exception { Configuration conf = new Configuration(); URI sharedA = new URI("file:///shared-A"); - URI sharedB = new URI("file:///shared-B"); URI localA = new URI("file:///local-A"); URI localB = new URI("file:///local-B"); URI localC = new URI("file:///local-C"); conf.set(DFSConfigKeys.DFS_NAMENODE_SHARED_EDITS_DIR_KEY, - Joiner.on(",").join(sharedA,sharedB)); + sharedA.toString()); // List them in reverse order, to make sure they show up in // the order listed, regardless of lexical sort order. conf.set(DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY, @@ -93,7 +115,7 @@ public class TestFailureOfSharedDir { assertEquals( "Shared dirs should come first, then local dirs, in the order " + "they were listed in the configuration.", - Joiner.on(",").join(sharedA, sharedB, localC, localB, localA), + Joiner.on(",").join(sharedA, localC, localB, localA), Joiner.on(",").join(dirs)); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHAConfiguration.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHAConfiguration.java index a51648d9cf..785f4b2237 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHAConfiguration.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHAConfiguration.java @@ -20,6 +20,7 @@ package org.apache.hadoop.hdfs.server.namenode.ha; import static org.apache.hadoop.hdfs.DFSConfigKeys.*; import static org.junit.Assert.*; +import java.io.IOException; import java.net.URI; import java.util.Collection; @@ -87,7 +88,7 @@ public class TestHAConfiguration { * duplicates removed */ @Test - public void testHAUniqueEditDirs() { + public void testHAUniqueEditDirs() throws IOException { Configuration config = new Configuration(); config.set(DFS_NAMENODE_EDITS_DIR_KEY, "file://edits/dir, "