You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by we...@apache.org on 2021/04/02 09:21:17 UTC
[hadoop] 07/09: HDFS-15316. Deletion failure should not remove
directory from snapshottables. Contributed by hemanthboyina
This is an automated email from the ASF dual-hosted git repository.
weichiu pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit 02d37c7d22985cae323aef3f05cb48361ed414c4
Author: Surendra Singh Lilhore <su...@apache.org>
AuthorDate: Wed May 13 15:01:07 2020 +0530
HDFS-15316. Deletion failure should not remove directory from snapshottables. Contributed by hemanthboyina
(cherry picked from commit 743c2e9071f4a73e0196ad4ca005b767758642b9)
---
.../hadoop/hdfs/server/namenode/FSDirDeleteOp.java | 4 +-
.../hdfs/server/namenode/TestDeleteRace.java | 46 ++++++++++++++++++++++
2 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirDeleteOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirDeleteOp.java
index 47f25f6..2dfb90e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirDeleteOp.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirDeleteOp.java
@@ -61,10 +61,10 @@ class FSDirDeleteOp {
removedUCFiles);
if (unprotectedDelete(fsd, iip, context, mtime)) {
filesRemoved = context.quotaDelta().getNsDelta();
+ fsn.removeSnapshottableDirs(snapshottableDirs);
}
fsd.updateReplicationFactor(context.collectedBlocks()
.toUpdateReplicationInfo());
- fsn.removeSnapshottableDirs(snapshottableDirs);
fsd.updateCount(iip, context.quotaDelta(), false);
}
} finally {
@@ -144,9 +144,9 @@ class FSDirDeleteOp {
new ReclaimContext(fsd.getBlockStoragePolicySuite(),
collectedBlocks, removedINodes, removedUCFiles),
mtime);
- fsn.removeSnapshottableDirs(snapshottableDirs);
if (filesRemoved) {
+ fsn.removeSnapshottableDirs(snapshottableDirs);
fsn.removeLeasesAndINodes(removedUCFiles, removedINodes, false);
fsn.getBlockManager().removeBlocksAndUpdateSafemodeTotal(collectedBlocks);
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestDeleteRace.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestDeleteRace.java
index cdb57f2..9d32528 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestDeleteRace.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestDeleteRace.java
@@ -66,6 +66,8 @@ import org.mockito.Mockito;
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_LEASE_HARDLIMIT_KEY;
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_LEASE_RECHECK_INTERVAL_MS_KEY;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
import static org.junit.Assert.assertNotEquals;
/**
@@ -492,4 +494,48 @@ public class TestDeleteRace {
}
}
}
+
+ /**
+ * Test get snapshot diff on a directory which delete got failed.
+ */
+ @Test
+ public void testDeleteOnSnapshottableDir() throws Exception {
+ conf.setBoolean(
+ DFSConfigKeys.DFS_NAMENODE_SNAPSHOT_DIFF_ALLOW_SNAP_ROOT_DESCENDANT,
+ true);
+ try {
+ cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build();
+ cluster.waitActive();
+ DistributedFileSystem hdfs = cluster.getFileSystem();
+ FSNamesystem fsn = cluster.getNamesystem();
+ FSDirectory fsdir = fsn.getFSDirectory();
+ Path dir = new Path("/dir");
+ hdfs.mkdirs(dir);
+ hdfs.allowSnapshot(dir);
+ Path file1 = new Path(dir, "file1");
+ Path file2 = new Path(dir, "file2");
+
+ // directory should not get deleted
+ FSDirectory fsdir2 = Mockito.spy(fsdir);
+ cluster.getNamesystem().setFSDirectory(fsdir2);
+ Mockito.doReturn(-1L).when(fsdir2).removeLastINode(any());
+ hdfs.delete(dir, true);
+
+ // create files and create snapshots
+ DFSTestUtil.createFile(hdfs, file1, BLOCK_SIZE, (short) 1, 0);
+ hdfs.createSnapshot(dir, "s1");
+ DFSTestUtil.createFile(hdfs, file2, BLOCK_SIZE, (short) 1, 0);
+ hdfs.createSnapshot(dir, "s2");
+
+ // should able to get snapshot diff on ancestor dir
+ Path dirDir1 = new Path(dir, "dir1");
+ hdfs.mkdirs(dirDir1);
+ hdfs.getSnapshotDiffReport(dirDir1, "s2", "s1");
+ assertEquals(1, fsn.getSnapshotManager().getNumSnapshottableDirs());
+ } finally {
+ if (cluster != null) {
+ cluster.shutdown();
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org