|
@@ -52,31 +52,42 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
* 1) previous directory exists
|
|
|
* 2) previous.tmp directory exists
|
|
|
* 3) removed.tmp directory exists
|
|
|
- * 4) node should recover and startup
|
|
|
- * 5) current directory should exist after recovery but before startup
|
|
|
- * 6) previous directory should exist after recovery but before startup
|
|
|
+ * 4) lastcheckpoint.tmp directory exists
|
|
|
+ * 5) node should recover and startup
|
|
|
+ * 6) current directory should exist after recovery but before startup
|
|
|
+ * 7) previous directory should exist after recovery but before startup
|
|
|
*/
|
|
|
static boolean[][] testCases = new boolean[][] {
|
|
|
- new boolean[] {true, false, false, false, true, true, false}, // 1
|
|
|
- new boolean[] {true, true, false, false, true, true, true }, // 2
|
|
|
- new boolean[] {true, false, true, false, true, true, true }, // 3
|
|
|
- new boolean[] {true, true, true, true, false, false, false }, // 4
|
|
|
- new boolean[] {true, true, true, false, false, false, false }, // 4
|
|
|
- new boolean[] {false, true, true, true, false, false, false }, // 4
|
|
|
- new boolean[] {false, true, true, false, false, false, false }, // 4
|
|
|
- new boolean[] {false, false, false, false, false, false, false }, // 5
|
|
|
- new boolean[] {false, true, false, false, false, false, false }, // 6
|
|
|
- new boolean[] {false, false, true, false, true, true, false}, // 7
|
|
|
- new boolean[] {true, false, false, true, true, true, false}, // 8
|
|
|
- new boolean[] {true, true, false, true, false, false, false }, // 9
|
|
|
- new boolean[] {true, true, true, true, false, false, false }, // 10
|
|
|
- new boolean[] {true, false, true, true, false, false, false }, // 10
|
|
|
- new boolean[] {false, true, true, true, false, false, false }, // 10
|
|
|
- new boolean[] {false, false, true, true, false, false, false }, // 10
|
|
|
- new boolean[] {false, false, false, true, false, false, false }, // 11
|
|
|
- new boolean[] {false, true, false, true, true, true, true }, // 12
|
|
|
+ new boolean[] {true, false, false, false, false, true, true, false}, // 1
|
|
|
+ new boolean[] {true, true, false, false, false, true, true, true }, // 2
|
|
|
+ new boolean[] {true, false, true, false, false, true, true, true }, // 3
|
|
|
+ new boolean[] {true, true, true, true, false, false, false, false}, // 4
|
|
|
+ new boolean[] {true, true, true, false, false, false, false, false}, // 4
|
|
|
+ new boolean[] {false, true, true, true, false, false, false, false}, // 4
|
|
|
+ new boolean[] {false, true, true, false, false, false, false, false}, // 4
|
|
|
+ new boolean[] {false, false, false, false, false, false, false, false}, // 5
|
|
|
+ new boolean[] {false, true, false, false, false, false, false, false}, // 6
|
|
|
+ new boolean[] {false, false, true, false, false, true, true, false}, // 7
|
|
|
+ new boolean[] {true, false, false, true, false, true, true, false}, // 8
|
|
|
+ new boolean[] {true, true, false, true, false, false, false, false}, // 9
|
|
|
+ new boolean[] {true, true, true, true, false, false, false, false}, // 10
|
|
|
+ new boolean[] {true, false, true, true, false, false, false, false}, // 10
|
|
|
+ new boolean[] {false, true, true, true, false, false, false, false}, // 10
|
|
|
+ new boolean[] {false, false, true, true, false, false, false, false}, // 10
|
|
|
+ new boolean[] {false, false, false, true, false, false, false, false}, // 11
|
|
|
+ new boolean[] {false, true, false, true, false, true, true, true }, // 12
|
|
|
+ // name-node specific cases
|
|
|
+ new boolean[] {true, false, false, false, true, true, true, false}, // 13
|
|
|
+ new boolean[] {true, true, false, false, true, true, true, false}, // 13
|
|
|
+ new boolean[] {false, false, false, false, true, true, true, false}, // 14
|
|
|
+ new boolean[] {false, true, false, false, true, true, true, false}, // 14
|
|
|
+ new boolean[] {true, false, true, false, true, false, false, false}, // 15
|
|
|
+ new boolean[] {true, true, false, true, true, false, false, false} // 16
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
+ private static final int NUM_NN_TEST_CASES = testCases.length;
|
|
|
+ private static final int NUM_DN_TEST_CASES = 18;
|
|
|
+
|
|
|
/**
|
|
|
* Writes an INFO log message containing the parameters. Only
|
|
|
* the first 4 elements of the state array are included in the message.
|
|
@@ -90,7 +101,8 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
+ " current="+state[0]
|
|
|
+ " previous="+state[1]
|
|
|
+ " previous.tmp="+state[2]
|
|
|
- + " removed.tmp="+state[3]);
|
|
|
+ + " removed.tmp="+state[3]
|
|
|
+ + " lastcheckpoint.tmp="+state[4]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -122,6 +134,8 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
UpgradeUtilities.createStorageDirs(nodeType, baseDirs, "previous.tmp");
|
|
|
if (state[3]) // removed.tmp
|
|
|
UpgradeUtilities.createStorageDirs(nodeType, baseDirs, "removed.tmp");
|
|
|
+ if (state[4]) // lastcheckpoint.tmp
|
|
|
+ UpgradeUtilities.createStorageDirs(nodeType, baseDirs, "lastcheckpoint.tmp");
|
|
|
return baseDirs;
|
|
|
}
|
|
|
|
|
@@ -172,21 +186,20 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
|
|
|
/**
|
|
|
* This test iterates over the testCases table and attempts
|
|
|
- * to startup the NameNode and DataNode normally.
|
|
|
+ * to startup the NameNode normally.
|
|
|
*/
|
|
|
- public void testStorageStates() throws Exception {
|
|
|
+ public void testNNStorageStates() throws Exception {
|
|
|
String[] baseDirs;
|
|
|
- UpgradeUtilities.initialize();
|
|
|
|
|
|
for (int numDirs = 1; numDirs <= 2; numDirs++) {
|
|
|
conf = new Configuration();
|
|
|
conf.setInt("dfs.datanode.scan.period.hours", -1);
|
|
|
conf = UpgradeUtilities.initializeStorageStateConf(numDirs, conf);
|
|
|
- for (int i = 0; i < testCases.length; i++) {
|
|
|
+ for (int i = 0; i < NUM_NN_TEST_CASES; i++) {
|
|
|
boolean[] testCase = testCases[i];
|
|
|
- boolean shouldRecover = testCase[4];
|
|
|
- boolean curAfterRecover = testCase[5];
|
|
|
- boolean prevAfterRecover = testCase[6];
|
|
|
+ boolean shouldRecover = testCase[5];
|
|
|
+ boolean curAfterRecover = testCase[6];
|
|
|
+ boolean prevAfterRecover = testCase[7];
|
|
|
|
|
|
log("NAME_NODE recovery", numDirs, i, testCase);
|
|
|
baseDirs = createStorageState(NAME_NODE, testCase);
|
|
@@ -203,15 +216,37 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
// check that the message says "not formatted"
|
|
|
// when storage directory is empty (case #5)
|
|
|
if(!testCases[i][0] && !testCases[i][2]
|
|
|
- && !testCases[i][1] && !testCases[i][3]) {
|
|
|
+ && !testCases[i][1] && !testCases[i][3] && !testCases[i][4]) {
|
|
|
assertTrue(expected.getLocalizedMessage().contains(
|
|
|
"NameNode is not formatted"));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ cluster.shutdown();
|
|
|
+ } // end testCases loop
|
|
|
+ } // end numDirs loop
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * This test iterates over the testCases table and attempts
|
|
|
+ * to startup the DataNode normally.
|
|
|
+ */
|
|
|
+ public void testDNStorageStates() throws Exception {
|
|
|
+ String[] baseDirs;
|
|
|
+
|
|
|
+ for (int numDirs = 1; numDirs <= 2; numDirs++) {
|
|
|
+ conf = new Configuration();
|
|
|
+ conf.setInt("dfs.datanode.scan.period.hours", -1);
|
|
|
+ conf = UpgradeUtilities.initializeStorageStateConf(numDirs, conf);
|
|
|
+ for (int i = 0; i < NUM_DN_TEST_CASES; i++) {
|
|
|
+ boolean[] testCase = testCases[i];
|
|
|
+ boolean shouldRecover = testCase[5];
|
|
|
+ boolean curAfterRecover = testCase[6];
|
|
|
+ boolean prevAfterRecover = testCase[7];
|
|
|
+
|
|
|
log("DATA_NODE recovery", numDirs, i, testCase);
|
|
|
- createStorageState(NAME_NODE, new boolean[] {true, true, false, false});
|
|
|
+ createStorageState(NAME_NODE,
|
|
|
+ new boolean[] {true, true, false, false, false});
|
|
|
cluster = new MiniDFSCluster(conf, 0, StartupOption.REGULAR);
|
|
|
baseDirs = createStorageState(DATA_NODE, testCase);
|
|
|
if (!testCase[0] && !testCase[1] && !testCase[2] && !testCase[3]) {
|
|
@@ -234,14 +269,21 @@ public class TestDFSStorageStateRecovery extends TestCase {
|
|
|
} // end testCases loop
|
|
|
} // end numDirs loop
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ protected void setUp() throws Exception {
|
|
|
+ LOG.info("Setting up the directory structures.");
|
|
|
+ UpgradeUtilities.initialize();
|
|
|
+ }
|
|
|
+
|
|
|
protected void tearDown() throws Exception {
|
|
|
LOG.info("Shutting down MiniDFSCluster");
|
|
|
if (cluster != null) cluster.shutdown();
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
- new TestDFSStorageStateRecovery().testStorageStates();
|
|
|
+ TestDFSStorageStateRecovery test = new TestDFSStorageStateRecovery();
|
|
|
+ test.testNNStorageStates();
|
|
|
+ test.testDNStorageStates();
|
|
|
}
|
|
|
|
|
|
}
|