From 03ba436d42418226a5edb754f5119fe69039c8b8 Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Thu, 2 May 2013 04:51:21 +0000 Subject: [PATCH] HDFS-4785. Concat operation does not remove concatenated files from InodeMap. Contributed by Suresh Srinivas. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1478267 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSDirectory.java | 1 + .../hdfs/server/namenode/TestINodeFile.java | 21 ++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 1e446de3517..7c1685ccc9b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -270,6 +270,9 @@ Trunk (Unreleased) HDFS-4687. TestDelegationTokenForProxyUser#testWebHdfsDoAs is flaky with JDK7. (Andrew Wang via atm) + HDFS-4785. Concat operation does not remove concatenated files from + InodeMap. (suresh) + BREAKDOWN OF HADOOP-8562 and HDFS-3602 SUBTASKS AND RELATED JIRAS HDFS-4145. Merge hdfs cmd line scripts from branch-1-win. (David Lao, diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java index 8e3a74bb0d8..aa7bd609c67 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java @@ -971,6 +971,7 @@ public class FSDirectory implements Closeable { nodeToRemove.setBlocks(null); trgParent.removeChild(nodeToRemove); + inodeMap.remove(nodeToRemove); count++; } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeFile.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeFile.java index ba1c968fcea..01003a66713 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeFile.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeFile.java @@ -451,8 +451,27 @@ public class TestINodeFile { assertTrue(fs.delete(renamedPath, true)); inodeCount -= 2; assertEquals(inodeCount, fsn.dir.getInodeMapSize()); + + // Create and concat /test/file1 /test/file2 + // Create /test1/file1 and /test1/file2 + String file1 = "/test1/file1"; + String file2 = "/test1/file2"; + DFSTestUtil.createFile(fs, new Path(file1), 512, (short) 1, 0); + DFSTestUtil.createFile(fs, new Path(file2), 512, (short) 1, 0); + inodeCount += 3; // test1, file1 and file2 are created + expectedLastInodeId += 3; + assertEquals(inodeCount, fsn.dir.getInodeMapSize()); + assertEquals(expectedLastInodeId, fsn.getLastInodeId()); + // Concat the /test1/file1 /test1/file2 into /test1/file2 + nnrpc.concat(file2, new String[] {file1}); + inodeCount--; // file1 and file2 are concatenated to file2 + assertEquals(inodeCount, fsn.dir.getInodeMapSize()); + assertEquals(expectedLastInodeId, fsn.getLastInodeId()); + assertTrue(fs.delete(new Path("/test1"), true)); + inodeCount -= 2; // test1 and file2 is deleted + assertEquals(inodeCount, fsn.dir.getInodeMapSize()); - // Make sure empty editlog can be handled + // Make sure editlog is loaded correctly cluster.restartNameNode(); cluster.waitActive(); fsn = cluster.getNamesystem();