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

This commit is contained in:
Arpit Agarwal 2017-02-01 16:51:58 -08:00
parent b6f290d5b6
commit 6aa09dc28a
3 changed files with 25 additions and 1 deletions

View File

@ -180,7 +180,14 @@ class JNStorage extends Storage {
} }
void format(NamespaceInfo nsInfo) throws IOException { void format(NamespaceInfo nsInfo) throws IOException {
unlockAll();
try {
sd.analyzeStorage(StartupOption.FORMAT, this, true);
} finally {
sd.unlock();
}
setStorageInfo(nsInfo); setStorageInfo(nsInfo);
LOG.info("Formatting journal " + sd + " with nsid: " + getNamespaceID()); LOG.info("Formatting journal " + sd + " with nsid: " + getNamespaceID());
// Unlock the directory before formatting, because we will // Unlock the directory before formatting, because we will
// re-analyze it after format(). The analyzeStorage() call // re-analyze it after format(). The analyzeStorage() call

View File

@ -550,7 +550,7 @@ public abstract class Storage extends StorageInfo {
Files.newDirectoryStream(currentDir.toPath())) { Files.newDirectoryStream(currentDir.toPath())) {
if (dirStream.iterator().hasNext()) { if (dirStream.iterator().hasNext()) {
throw new InconsistentFSStateException(root, 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."); + "directory is not empty.");
} }
} }

View File

@ -204,6 +204,9 @@ public class TestJournal {
// Close the journal in preparation for reformatting it. // Close the journal in preparation for reformatting it.
journal.close(); journal.close();
// Clear the storage directory before reformatting it
journal.getStorage().getJournalManager()
.getStorageDirectory().clearDirectory();
journal.format(FAKE_NSINFO_2); journal.format(FAKE_NSINFO_2);
assertEquals(0, journal.getLastPromisedEpoch()); 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);
}
}
} }