HDFS-11112. Journal Nodes should refuse to format non-empty directories. Contributed by Yiqun Lin.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b64d9093 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b64d9093 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b64d9093 Branch: refs/heads/branch-2 Commit: b64d9093e1a7e6fbc10cf46bbeed723d1bb05d9d Parents: 2f4cf07 Author: Arpit Agarwal <a...@apache.org> Authored: Wed Feb 1 16:51:58 2017 -0800 Committer: Arpit Agarwal <a...@apache.org> Committed: Wed Feb 1 16:52:07 2017 -0800 ---------------------------------------------------------------------- .../hadoop/hdfs/qjournal/server/JNStorage.java | 7 +++++++ .../apache/hadoop/hdfs/server/common/Storage.java | 2 +- .../hadoop/hdfs/qjournal/server/TestJournal.java | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/b64d9093/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java index 77171a1..07c9286 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java @@ -180,7 +180,14 @@ class JNStorage extends Storage { } void format(NamespaceInfo nsInfo) throws IOException { + unlockAll(); + try { + sd.analyzeStorage(StartupOption.FORMAT, this, true); + } finally { + sd.unlock(); + } setStorageInfo(nsInfo); + LOG.info("Formatting journal " + sd + " with nsid: " + getNamespaceID()); // Unlock the directory before formatting, because we will // re-analyze it after format(). The analyzeStorage() call http://git-wip-us.apache.org/repos/asf/hadoop/blob/b64d9093/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java index 87ba99d..5f340d9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java @@ -495,7 +495,7 @@ public abstract class Storage extends StorageInfo { Files.newDirectoryStream(currentDir.toPath())) { if (dirStream.iterator().hasNext()) { throw new InconsistentFSStateException(root, - "Can't format the storage directory because the current/ " + "Can't format the storage directory because the current " + "directory is not empty."); } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/b64d9093/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournal.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournal.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournal.java index e181fd6..7bc0d9b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournal.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournal.java @@ -204,6 +204,9 @@ public class TestJournal { // Close the journal in preparation for reformatting it. journal.close(); + // Clear the storage directory before reformatting it + journal.getStorage().getJournalManager() + .getStorageDirectory().clearDirectory(); journal.format(FAKE_NSINFO_2); assertEquals(0, journal.getLastPromisedEpoch()); @@ -417,4 +420,18 @@ public class TestJournal { } } + @Test + public void testFormatNonEmptyStorageDirectories() throws Exception { + try { + // Format again here and to format the non-empty directories in + // journal node. + journal.format(FAKE_NSINFO); + fail("Did not fail to format non-empty directories in journal node."); + } catch (IOException ioe) { + GenericTestUtils.assertExceptionContains( + "Can't format the storage directory because the current " + + "directory is not empty.", ioe); + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org