This is an automated email from the ASF dual-hosted git repository. stevel pushed a commit to branch branch-3.3.3 in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit 980fab9168670f4c9f2fb596ea28e7613bb39d7b Author: singer-bin <[email protected]> AuthorDate: Sun Feb 6 13:05:57 2022 +0800 HDFS-16437 ReverseXML processor doesn't accept XML files without the … (#3926) (cherry picked from commit 125e3b616040b4f98956aa946cc51e99f7d596c2) Change-Id: I03e4f2af17f0e4a8245c9c2c8ea1cb2cb41f777a --- .../OfflineImageReconstructor.java | 4 +++ .../offlineImageViewer/TestOfflineImageViewer.java | 42 +++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/OfflineImageReconstructor.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/OfflineImageReconstructor.java index 9ad4b090649..203bcc13284 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/OfflineImageReconstructor.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/OfflineImageReconstructor.java @@ -1761,6 +1761,10 @@ class OfflineImageReconstructor { XMLEvent ev = expectTag("[section header]", true); if (ev.getEventType() == XMLStreamConstants.END_ELEMENT) { if (ev.asEndElement().getName().getLocalPart().equals("fsimage")) { + if(unprocessedSections.size() == 1 && unprocessedSections.contains + (SnapshotDiffSectionProcessor.NAME)){ + break; + } throw new IOException("FSImage XML ended prematurely, without " + "including section(s) " + StringUtils.join(", ", unprocessedSections)); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java index 7bf3bfc1f8e..8980e18b68e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewer.java @@ -1122,17 +1122,17 @@ public class TestOfflineImageViewer { LOG.info("Creating reverseImage.xml=" + reverseImageXml.getAbsolutePath() + ", reverseImage=" + reverseImage.getAbsolutePath() + ", reverseImage2Xml=" + reverseImage2Xml.getAbsolutePath()); - if (OfflineImageViewerPB.run(new String[] { "-p", "XML", + if (OfflineImageViewerPB.run(new String[] {"-p", "XML", "-i", originalFsimage.getAbsolutePath(), "-o", reverseImageXml.getAbsolutePath() }) != 0) { throw new IOException("oiv returned failure creating first XML file."); } - if (OfflineImageViewerPB.run(new String[] { "-p", "ReverseXML", + if (OfflineImageViewerPB.run(new String[] {"-p", "ReverseXML", "-i", reverseImageXml.getAbsolutePath(), "-o", reverseImage.getAbsolutePath() }) != 0) { throw new IOException("oiv returned failure recreating fsimage file."); } - if (OfflineImageViewerPB.run(new String[] { "-p", "XML", + if (OfflineImageViewerPB.run(new String[] {"-p", "XML", "-i", reverseImage.getAbsolutePath(), "-o", reverseImage2Xml.getAbsolutePath() }) != 0) { throw new IOException("oiv returned failure creating second " + @@ -1141,7 +1141,7 @@ public class TestOfflineImageViewer { // The XML file we wrote based on the re-created fsimage should be the // same as the one we dumped from the original fsimage. Assert.assertEquals("", - GenericTestUtils.getFilesDiff(reverseImageXml, reverseImage2Xml)); + GenericTestUtils.getFilesDiff(reverseImageXml, reverseImage2Xml)); } /** @@ -1176,6 +1176,40 @@ public class TestOfflineImageViewer { } } + /** + * Tests that the ReverseXML processor doesn't accept XML files without the SnapshotDiffSection. + */ + @Test + public void testReverseXmlWithoutSnapshotDiffSection() throws Throwable { + File imageWSDS = new File(tempDir, "imageWithoutSnapshotDiffSection.xml"); + try(PrintWriter writer = new PrintWriter(imageWSDS, "UTF-8")) { + writer.println("<?xml version=\"1.0\"?>"); + writer.println("<fsimage>"); + writer.println("<version>"); + writer.println("<layoutVersion>-66</layoutVersion>"); + writer.println("<onDiskVersion>1</onDiskVersion>"); + writer.println("<oivRevision>545bbef596c06af1c3c8dca1ce29096a64608478</oivRevision>"); + writer.println("</version>"); + writer.println("<FileUnderConstructionSection></FileUnderConstructionSection>"); + writer.println("<ErasureCodingSection></ErasureCodingSection>"); + writer.println("<INodeSection><lastInodeId>91488</lastInodeId><numInodes>0</numInodes>" + + "</INodeSection>"); + writer.println("<SecretManagerSection><currentId>90</currentId><tokenSequenceNumber>35" + + "</tokenSequenceNumber><numDelegationKeys>0</numDelegationKeys><numTokens>0" + + "</numTokens></SecretManagerSection>"); + writer.println("<INodeReferenceSection></INodeReferenceSection>"); + writer.println("<SnapshotSection><snapshotCounter>0</snapshotCounter><numSnapshots>0" + + "</numSnapshots></SnapshotSection>"); + writer.println("<NameSection><namespaceId>326384987</namespaceId></NameSection>"); + writer.println("<CacheManagerSection><nextDirectiveId>1</nextDirectiveId><numPools>0" + + "</numPools><numDirectives>0</numDirectives></CacheManagerSection>"); + writer.println("<INodeDirectorySection></INodeDirectorySection>"); + writer.println("</fsimage>"); + } + OfflineImageReconstructor.run(imageWSDS.getAbsolutePath(), + imageWSDS.getAbsolutePath() + ".out"); + } + @Test public void testFileDistributionCalculatorForException() throws Exception { File fsimageFile = null; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
