diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java index df4b43039c364..5bf5fb75640a9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeReference.java @@ -831,17 +831,17 @@ public void cleanSubtree(ReclaimContext reclaimContext, int snapshot, * * @param context to {@link ReclaimContext#getSnapshotIdToBeDeleted()} */ - private boolean shouldDestroy(ReclaimContext context) { + private void shouldDestroy(ReclaimContext context) { final int snapshotToBeDeleted = context.getSnapshotIdToBeDeleted(); - if (dstSnapshotId < snapshotToBeDeleted) { - return true; + if (snapshotToBeDeleted == Snapshot.CURRENT_STATE_ID + || snapshotToBeDeleted > dstSnapshotId) { + return; } LOG.warn("Try to destroy a DstReference with dstSnapshotId = {}" + " >= snapshotToBeDeleted = {}", dstSnapshotId, snapshotToBeDeleted); LOG.warn(" dstRef: {}", toDetailString()); final INode r = getReferredINode().asReference().getReferredINode(); LOG.warn(" referred: {}", r.toDetailString()); - return false; } /** @@ -857,9 +857,7 @@ private boolean shouldDestroy(ReclaimContext context) { */ @Override public void destroyAndCollectBlocks(ReclaimContext reclaimContext) { - if (!shouldDestroy(reclaimContext)) { - return; - } + shouldDestroy(reclaimContext); // since we count everything of the subtree for the quota usage of a // dst reference node, here we should just simply do a quota computation. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestRenameWithSnapshots.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestRenameWithSnapshots.java index df30b34952696..25688988e5b2c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestRenameWithSnapshots.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestRenameWithSnapshots.java @@ -163,6 +163,7 @@ public void testRenameFromSDir2NonSDir() throws Exception { hdfs.delete(bar, false); Assert.assertEquals(1, withCount.getReferenceCount()); + restartClusterAndCheckImage(true); } private static boolean existsInDiffReport(List entries, @@ -196,6 +197,7 @@ public void testRenameFileNotInSnapshot() throws Exception { assertTrue(existsInDiffReport(entries, DiffType.MODIFY, "", null)); assertTrue(existsInDiffReport(entries, DiffType.CREATE, file2.getName(), null)); + restartClusterAndCheckImage(true); } /** @@ -218,6 +220,7 @@ public void testRenameFileInSnapshot() throws Exception { assertTrue(existsInDiffReport(entries, DiffType.MODIFY, "", null)); assertTrue(existsInDiffReport(entries, DiffType.RENAME, file1.getName(), file2.getName())); + restartClusterAndCheckImage(true); } @Test (timeout=60000)