From 0deff1727ec4c82bc8babb63e6422be3fcd076f1 Mon Sep 17 00:00:00 2001 From: Tsz-wo Sze Date: Sat, 23 Feb 2013 02:44:05 +0000 Subject: [PATCH] HDFS-4524. Update SnapshotManager#snapshottables when loading fsimage. Contributed by Jing Zhao git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1449265 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-hdfs/CHANGES.HDFS-2802.txt | 3 +++ .../hdfs/server/namenode/FSImageFormat.java | 4 ++++ .../namenode/snapshot/SnapshotManager.java | 9 ++++++++ .../namenode/TestFSImageWithSnapshot.java | 23 +++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt index 65d59e0430..89149b0cd2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt @@ -167,3 +167,6 @@ Branch-2802 Snapshot (Unreleased) HDFS-4499. Fix file/directory/snapshot deletion for file diff. (Jing Zhao via szetszwo) + + HDFS-4524. Update SnapshotManager#snapshottables when loading fsimage. + (Jing Zhao via szetszwo) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java index b99ec9bd82..dbf0008b2d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormat.java @@ -413,6 +413,10 @@ public class FSImageFormat { if (numSnapshots >= 0) { final INodeDirectorySnapshottable snapshottableParent = INodeDirectorySnapshottable.valueOf(parent, parentPath); + if (snapshottableParent.getParent() != null) { // not root + this.namesystem.getSnapshotManager().addSnapshottable( + snapshottableParent); + } // load snapshots and snapshotQuota SnapshotFSImageFormat.loadSnapshotList(snapshottableParent, numSnapshots, in, this); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/SnapshotManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/SnapshotManager.java index 4c7da46c58..436d1739c6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/SnapshotManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/snapshot/SnapshotManager.java @@ -80,6 +80,15 @@ public class SnapshotManager implements SnapshotStats { snapshottables.add(s); numSnapshottableDirs.getAndIncrement(); } + + /** + * Add a snapshottable dir into {@link #snapshottables}. Called when loading + * fsimage. + * @param dir The snapshottable dir to be added. + */ + public void addSnapshottable(INodeDirectorySnapshottable dir) { + snapshottables.add(dir); + } /** * Set the given snapshottable directory to non-snapshottable. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithSnapshot.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithSnapshot.java index 8806cc7d61..6c8be7f29d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithSnapshot.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithSnapshot.java @@ -21,7 +21,9 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.List; import java.util.Random; import org.apache.commons.logging.impl.Log4JLogger; @@ -33,11 +35,13 @@ import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.client.HdfsDataOutputStream; import org.apache.hadoop.hdfs.client.HdfsDataOutputStream.SyncFlag; +import org.apache.hadoop.hdfs.protocol.SnapshottableDirectoryStatus; import org.apache.hadoop.hdfs.server.namenode.NNStorage.NameNodeFile; import org.apache.hadoop.hdfs.server.namenode.snapshot.SnapshotTestHelper; import org.apache.hadoop.hdfs.util.Canceler; import org.apache.log4j.Level; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -214,6 +218,10 @@ public class TestFSImageWithSnapshot { // save the namesystem to a temp file File imageFile = saveFSImageToTempFile(); + + long numSdirBefore = fsn.getNumSnapshottableDirs(); + long numSnapshotBefore = fsn.getNumSnapshots(); + SnapshottableDirectoryStatus[] dirBefore = hdfs.getSnapshottableDirListing(); // restart the cluster, and format the cluster cluster.shutdown(); @@ -231,6 +239,21 @@ public class TestFSImageWithSnapshot { // compare two dumped tree SnapshotTestHelper.compareDumpedTreeInFile(fsnBefore, fsnAfter); + + long numSdirAfter = fsn.getNumSnapshottableDirs(); + long numSnapshotAfter = fsn.getNumSnapshots(); + SnapshottableDirectoryStatus[] dirAfter = hdfs.getSnapshottableDirListing(); + + Assert.assertEquals(numSdirBefore, numSdirAfter); + Assert.assertEquals(numSnapshotBefore, numSnapshotAfter); + Assert.assertEquals(dirBefore.length, dirAfter.length); + List pathListBefore = new ArrayList(); + for (SnapshottableDirectoryStatus sBefore : dirBefore) { + pathListBefore.add(sBefore.getFullPath().toString()); + } + for (SnapshottableDirectoryStatus sAfter : dirAfter) { + Assert.assertTrue(pathListBefore.contains(sAfter.getFullPath().toString())); + } } /**