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())); + } } /**