HDFS-10457. DataNode should not auto-format block pool directory if VERSION is missing. (Wei-Chiu Chuang via lei)

(cherry picked from commit bb3bcb9397593fc8a2fa63a48eba126609f72c42)
This commit is contained in:
Lei Xu 2016-08-08 15:54:12 -07:00
parent cc20316b55
commit 9cb6d291ea
2 changed files with 21 additions and 1 deletions

View File

@ -151,7 +151,7 @@ public class BlockPoolSliceStorage extends Storage {
throws IOException {
StorageDirectory sd = new StorageDirectory(dataDir, null, true);
try {
StorageState curState = sd.analyzeStorage(startOpt, this);
StorageState curState = sd.analyzeStorage(startOpt, this, true);
// sd is locked but not opened
switch (curState) {
case NORMAL:

View File

@ -43,6 +43,7 @@ import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor;
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager;
import org.apache.hadoop.hdfs.server.common.Storage;
import org.apache.hadoop.hdfs.server.datanode.fsdataset.FsDatasetSpi;
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
import org.apache.hadoop.hdfs.server.protocol.VolumeFailureSummary;
@ -480,6 +481,25 @@ public class TestDataNodeVolumeFailureReporting {
checkFailuresAtNameNode(dm, dns.get(0), false, dn1Vol1.getAbsolutePath());
}
@Test
public void testAutoFormatEmptyBlockPoolDirectory() throws Exception {
// remove the version file
DataNode dn = cluster.getDataNodes().get(0);
String bpid = cluster.getNamesystem().getBlockPoolId();
BlockPoolSliceStorage bps = dn.getStorage().getBPStorage(bpid);
Storage.StorageDirectory dir = bps.getStorageDir(0);
File current = dir.getCurrentDir();
File currentVersion = new File(current, "VERSION");
currentVersion.delete();
// restart the data node
assertTrue(cluster.restartDataNodes(true));
// the DN should tolerate one volume failure.
cluster.waitActive();
assertFalse("DataNode should not reformat if VERSION is missing",
currentVersion.exists());
}
/**
* Checks the NameNode for correct values of aggregate counters tracking failed
* volumes across all DataNodes.