HDFS-9934. ReverseXML oiv processor should bail out if the XML file's layoutVersion doesn't match oiv's (cmccabe)
This commit is contained in:
parent
500875dfcc
commit
bd49354c6d
|
@ -68,6 +68,7 @@ import org.apache.hadoop.hdfs.server.namenode.FsImageProto.INodeSection;
|
|||
import org.apache.hadoop.hdfs.server.namenode.FsImageProto.NameSystemSection;
|
||||
import org.apache.hadoop.hdfs.server.namenode.FsImageProto.SecretManagerSection;
|
||||
import org.apache.hadoop.hdfs.server.namenode.FsImageProto.SnapshotDiffSection.DiffEntry;
|
||||
import org.apache.hadoop.hdfs.server.namenode.NameNodeLayoutVersion;
|
||||
import org.apache.hadoop.hdfs.util.MD5FileUtils;
|
||||
import org.apache.hadoop.hdfs.util.XMLUtils;
|
||||
import org.apache.hadoop.io.IOUtils;
|
||||
|
@ -1493,6 +1494,16 @@ class OfflineImageReconstructor {
|
|||
throw new IOException("The <version> section doesn't contain " +
|
||||
"the layoutVersion.");
|
||||
}
|
||||
if (layoutVersion.intValue() !=
|
||||
NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION) {
|
||||
throw new IOException("Layout version mismatch. This oiv tool " +
|
||||
"handles layout version " +
|
||||
NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION + ", but the " +
|
||||
"XML file has <layoutVersion> " + layoutVersion + ". Please " +
|
||||
"either re-generate the XML file with the proper layout version, " +
|
||||
"or manually edit the XML file to be usable with this version " +
|
||||
"of the oiv tool.");
|
||||
}
|
||||
fileSummaryBld.setOndiskVersion(onDiskVersion);
|
||||
fileSummaryBld.setLayoutVersion(layoutVersion);
|
||||
if (LOG.isDebugEnabled()) {
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.io.FileOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.io.StringReader;
|
||||
import java.net.HttpURLConnection;
|
||||
|
@ -64,6 +65,7 @@ import org.apache.hadoop.hdfs.DistributedFileSystem;
|
|||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||
import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction;
|
||||
import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil;
|
||||
import org.apache.hadoop.hdfs.server.namenode.NameNodeLayoutVersion;
|
||||
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
|
||||
import org.apache.hadoop.io.IOUtils;
|
||||
import org.apache.hadoop.net.NetUtils;
|
||||
|
@ -499,4 +501,36 @@ public class TestOfflineImageViewer {
|
|||
Assert.assertEquals("",
|
||||
GenericTestUtils.getFilesDiff(reverseImageXml, reverseImage2Xml));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the ReverseXML processor doesn't accept XML files with the wrong
|
||||
* layoutVersion.
|
||||
*/
|
||||
@Test
|
||||
public void testReverseXmlWrongLayoutVersion() throws Throwable {
|
||||
File imageWrongVersion = new File(tempDir, "imageWrongVersion.xml");
|
||||
PrintWriter writer = new PrintWriter(imageWrongVersion, "UTF-8");
|
||||
try {
|
||||
writer.println("<?xml version=\"1.0\"?>");
|
||||
writer.println("<fsimage>");
|
||||
writer.println("<version>");
|
||||
writer.println(String.format("<layoutVersion>%d</layoutVersion>",
|
||||
NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION + 1));
|
||||
writer.println("<onDiskVersion>1</onDiskVersion>");
|
||||
writer.println("<oivRevision>" +
|
||||
"545bbef596c06af1c3c8dca1ce29096a64608478</oivRevision>");
|
||||
writer.println("</version>");
|
||||
writer.println("</fsimage>");
|
||||
} finally {
|
||||
writer.close();
|
||||
}
|
||||
try {
|
||||
OfflineImageReconstructor.run(imageWrongVersion.getAbsolutePath(),
|
||||
imageWrongVersion.getAbsolutePath() + ".out");
|
||||
Assert.fail("Expected OfflineImageReconstructor to fail with " +
|
||||
"version mismatch.");
|
||||
} catch (Throwable t) {
|
||||
GenericTestUtils.assertExceptionContains("Layout version mismatch.", t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue