public virtual void TestStorageRestore() { int numDatanodes = 0; cluster = new MiniDFSCluster.Builder(config).NumDataNodes(numDatanodes).ManageNameDfsDirs (false).Build(); cluster.WaitActive(); SecondaryNameNode secondary = new SecondaryNameNode(config); System.Console.Out.WriteLine("****testStorageRestore: Cluster and SNN started"); PrintStorages(cluster.GetNameNode().GetFSImage()); FileSystem fs = cluster.GetFileSystem(); Path path = new Path("/", "test"); NUnit.Framework.Assert.IsTrue(fs.Mkdirs(path)); System.Console.Out.WriteLine("****testStorageRestore: dir 'test' created, invalidating storage..." ); InvalidateStorage(cluster.GetNameNode().GetFSImage(), ImmutableSet.Of(path2, path3 )); PrintStorages(cluster.GetNameNode().GetFSImage()); System.Console.Out.WriteLine("****testStorageRestore: storage invalidated"); path = new Path("/", "test1"); NUnit.Framework.Assert.IsTrue(fs.Mkdirs(path)); System.Console.Out.WriteLine("****testStorageRestore: dir 'test1' created"); // We did another edit, so the still-active directory at 'path1' // should now differ from the others FSImageTestUtil.AssertFileContentsDifferent(2, new FilePath(path1, "current/" + NNStorage.GetInProgressEditsFileName (1)), new FilePath(path2, "current/" + NNStorage.GetInProgressEditsFileName(1)), new FilePath(path3, "current/" + NNStorage.GetInProgressEditsFileName(1))); FSImageTestUtil.AssertFileContentsSame(new FilePath(path2, "current/" + NNStorage.GetInProgressEditsFileName (1)), new FilePath(path3, "current/" + NNStorage.GetInProgressEditsFileName(1))); System.Console.Out.WriteLine("****testStorageRestore: checkfiles(false) run"); secondary.DoCheckpoint(); ///should enable storage.. // We should have a checkpoint through txid 4 in the two image dirs // (txid=4 for BEGIN, mkdir, mkdir, END) FSImageTestUtil.AssertFileContentsSame(new FilePath(path1, "current/" + NNStorage.GetImageFileName (4)), new FilePath(path2, "current/" + NNStorage.GetImageFileName(4))); NUnit.Framework.Assert.IsFalse("Should not have any image in an edits-only directory" , new FilePath(path3, "current/" + NNStorage.GetImageFileName(4)).Exists()); // Should have finalized logs in the directory that didn't fail NUnit.Framework.Assert.IsTrue("Should have finalized logs in the directory that didn't fail" , new FilePath(path1, "current/" + NNStorage.GetFinalizedEditsFileName(1, 4)).Exists ()); // Should not have finalized logs in the failed directories NUnit.Framework.Assert.IsFalse("Should not have finalized logs in the failed directories" , new FilePath(path2, "current/" + NNStorage.GetFinalizedEditsFileName(1, 4)).Exists ()); NUnit.Framework.Assert.IsFalse("Should not have finalized logs in the failed directories" , new FilePath(path3, "current/" + NNStorage.GetFinalizedEditsFileName(1, 4)).Exists ()); // The new log segment should be in all of the directories. FSImageTestUtil.AssertFileContentsSame(new FilePath(path1, "current/" + NNStorage.GetInProgressEditsFileName (5)), new FilePath(path2, "current/" + NNStorage.GetInProgressEditsFileName(5)), new FilePath(path3, "current/" + NNStorage.GetInProgressEditsFileName(5))); string md5BeforeEdit = FSImageTestUtil.GetFileMD5(new FilePath(path1, "current/" + NNStorage.GetInProgressEditsFileName(5))); // The original image should still be the previously failed image // directory after it got restored, since it's still useful for // a recovery! FSImageTestUtil.AssertFileContentsSame(new FilePath(path1, "current/" + NNStorage.GetImageFileName (0)), new FilePath(path2, "current/" + NNStorage.GetImageFileName(0))); // Do another edit to verify that all the logs are active. path = new Path("/", "test2"); NUnit.Framework.Assert.IsTrue(fs.Mkdirs(path)); // Logs should be changed by the edit. string md5AfterEdit = FSImageTestUtil.GetFileMD5(new FilePath(path1, "current/" + NNStorage.GetInProgressEditsFileName(5))); NUnit.Framework.Assert.IsFalse(md5BeforeEdit.Equals(md5AfterEdit)); // And all logs should be changed. FSImageTestUtil.AssertFileContentsSame(new FilePath(path1, "current/" + NNStorage.GetInProgressEditsFileName (5)), new FilePath(path2, "current/" + NNStorage.GetInProgressEditsFileName(5)), new FilePath(path3, "current/" + NNStorage.GetInProgressEditsFileName(5))); secondary.Shutdown(); cluster.Shutdown(); // All logs should be finalized by clean shutdown FSImageTestUtil.AssertFileContentsSame(new FilePath(path1, "current/" + NNStorage.GetFinalizedEditsFileName (5, 7)), new FilePath(path2, "current/" + NNStorage.GetFinalizedEditsFileName(5, 7)), new FilePath(path3, "current/" + NNStorage.GetFinalizedEditsFileName(5, 7)) ); }