HDFS-11112. Journal Nodes should refuse to format non-empty directories. Contributed by Yiqun Lin.
This commit is contained in:
parent
b6f290d5b6
commit
6aa09dc28a
@ -180,7 +180,14 @@ private static void purgeMatching(File dir, List<Pattern> patterns,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
@ -550,7 +550,7 @@ private void checkEmptyCurrent() throws InconsistentFSStateException,
|
|||||||
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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,6 +204,9 @@ public void testFormatResetsCachedValues() throws Exception {
|
|||||||
|
|
||||||
// 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 void testNamespaceVerification() throws Exception {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user