Explorar el Código

HDFS-11112. Journal Nodes should refuse to format non-empty directories. Contributed by Yiqun Lin.

Arpit Agarwal hace 8 años
padre
commit
6aa09dc28a

+ 7 - 0
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

+ 1 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/common/Storage.java

@@ -550,7 +550,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.");
         }
       }

+ 17 - 0
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);
+    }
+  }
+
 }