/** * test 1. create DFS cluster with 3 storage directories - 2 EDITS_IMAGE, 1 EDITS 2. create a * cluster and write a file 3. corrupt/disable one storage (or two) by removing 4. run * doCheckpoint - it will fail on removed dirs (which will invalidate the storages) 5. write * another file 6. check that edits and fsimage differ 7. run doCheckpoint 8. verify that all the * image and edits files are the same. */ @Test public void testStorageRestore() throws Exception { int numDatanodes = 2; cluster = new MiniDFSCluster(0, config, numDatanodes, true, false, true, null, null, null, null); cluster.waitActive(); SecondaryNameNode secondary = new SecondaryNameNode(config); FileSystem fs = cluster.getFileSystem(); Path path = new Path("/", "test"); writeFile(fs, path, 2); invalidateStorage(cluster.getNameNode().getFSImage()); path = new Path("/", "test1"); writeFile(fs, path, 2); checkFiles(false); secondary.doCheckpoint(); checkFiles(true); secondary.shutdown(); cluster.shutdown(); }
/** Create a connection to the primary namenode. */ public SecondaryNameNode(Configuration conf) throws IOException { try { initialize(conf); } catch (IOException e) { shutdown(); throw e; } }
/** * Test to simulate interleaved checkpointing by 2 2NNs after a storage directory has been taken * offline. The first will cause the directory to come back online, but it won't have any valid * contents. The second 2NN will then try to perform a checkpoint. The NN should not serve up the * image or edits from the restored (empty) dir. */ @Test public void testCheckpointWithRestoredDirectory() throws IOException { SecondaryNameNode secondary = null; try { cluster = new MiniDFSCluster(0, config, 1, true, false, true, null, null, null, null); cluster.waitActive(); secondary = new SecondaryNameNode(config); FSImage fsImage = cluster.getNameNode().getFSImage(); FileSystem fs = cluster.getFileSystem(); Path path1 = new Path("/", "test"); writeFile(fs, path1, 2); // Take name3 offline fsImage.getEditLog().removeEditsAndStorageDir(2); // Simulate a 2NN beginning a checkpoint, but not finishing. This will // cause name3 to be restored. cluster.getNameNode().rollEditLog(); // Now another 2NN comes along to do a full checkpoint. secondary.doCheckpoint(); // The created file should still exist in the in-memory FS state after the // checkpoint. assertTrue("File missing after checkpoint", fs.exists(path1)); secondary.shutdown(); // Restart the NN so it reloads the edits from on-disk. cluster.restartNameNode(); // The created file should still exist after the restart. assertTrue("path should still exist after restart", fs.exists(path1)); } finally { if (cluster != null) { cluster.shutdown(); } if (secondary != null) { secondary.shutdown(); } } }
/** Check whether the secondary name-node can be started. */ private boolean canStartSecondaryNode(Configuration conf) throws IOException { SecondaryNameNode sn = null; try { sn = new SecondaryNameNode(conf); } catch (IOException e) { if (e instanceof java.net.BindException) return false; throw e; } sn.shutdown(); return true; }
@Override protected void doDelete(SecondaryNameNode service) throws Exception { service.shutdown(); }