From c92b49876a078ce7fb4e2a852e315de5b6410082 Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Mon, 12 Aug 2019 17:26:20 -0700 Subject: [PATCH] HDFS-14148. HDFS OIV ReverseXML SnapshotSection parser throws exception when there are more than one snapshottable directory (#1274) Contributed by Siyao Meng. --- .../offlineImageViewer/OfflineImageReconstructor.java | 8 +++++--- .../offlineImageViewer/TestOfflineImageViewer.java | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 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 89f6dcc6ce..4bb8c07b1d 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 @@ -1353,9 +1353,11 @@ public void process() throws IOException { if (sd == null) { break; } - Long dir = sd.removeChildLong(SNAPSHOT_SECTION_DIR); - sd.verifyNoRemainingKeys(""); - bld.addSnapshottableDir(dir); + Long dir; + while ((dir = sd.removeChildLong(SNAPSHOT_SECTION_DIR)) != null) { + // Add all snapshottable directories, one by one + bld.addSnapshottableDir(dir); + } } header.verifyNoRemainingKeys("SnapshotSection"); bld.build().writeDelimitedTo(out); 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 67ad4cd5a6..f780516adb 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 @@ -288,6 +288,16 @@ public static void createOriginalFSImage() throws IOException { hdfs.truncate(file1, 1); writtenFiles.put(file1.toString(), hdfs.getFileStatus(file1)); + // HDFS-14148: Create a second snapshot-enabled directory. This can cause + // TestOfflineImageViewer#testReverseXmlRoundTrip to fail before the patch + final Path snapshotDir2 = new Path("/snapshotDir2"); + hdfs.mkdirs(snapshotDir2); + // Simply enable snapshot on it, no need to create one + hdfs.allowSnapshot(snapshotDir2); + dirCount++; + writtenFiles.put(snapshotDir2.toString(), + hdfs.getFileStatus(snapshotDir2)); + // Set XAttrs so the fsimage contains XAttr ops final Path xattr = new Path("/xattr"); hdfs.mkdirs(xattr);