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 2728420e5f7b9..30b98b8e86421 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 @@ -96,7 +96,7 @@ public class SnapshotManager implements SnapshotStatsMXBean { private final boolean snapshotDiffAllowSnapRootDescendant; private final AtomicInteger numSnapshots = new AtomicInteger(); - private static final int SNAPSHOT_ID_BIT_WIDTH = 24; + private static final int SNAPSHOT_ID_BIT_WIDTH = 28; private boolean allowNestedSnapshots = false; private int snapshotCounter = 0; @@ -541,7 +541,7 @@ public void clearSnapshottableDirs() { * * @return maximum allowable snapshot ID. */ - public int getMaxSnapshotID() { + public int getMaxSnapshotID() { return ((1 << SNAPSHOT_ID_BIT_WIDTH) - 1); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotManager.java index 3b4b1baa60f18..4d6e6f4172c02 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotManager.java @@ -92,4 +92,18 @@ public void testSnapshotLimits() throws Exception { StringUtils.toLowerCase(se.getMessage()).contains("rollover")); } } + + /** + * Snapshot is identified by INODE CURRENT_STATE_ID. + * So maximum allowable snapshotID should be less than CURRENT_STATE_ID + */ + @Test + public void testValidateSnapshotIDWidth() { + FSDirectory fsdir = mock(FSDirectory.class); + SnapshotManager snapshotManager = new SnapshotManager(new Configuration(), + fsdir); + Assert.assertTrue(snapshotManager. + getMaxSnapshotID() < Snapshot.CURRENT_STATE_ID); + } + }