From 9658ad4f49c0de295abdad99e0fb0f0af3653545 Mon Sep 17 00:00:00 2001 From: Tsz-wo Sze Date: Thu, 5 Apr 2012 18:30:24 +0000 Subject: [PATCH] svn merge -c 1309994 from trunk for HADOOP-6963. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1309997 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++ hadoop-common-project/hadoop-common/pom.xml | 5 +++++ .../java/org/apache/hadoop/fs/FileUtil.java | 11 +++++++++-- .../java/org/apache/hadoop/fs/TestFileUtil.java | 17 +++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index bdbd4e009e3..b6a0cdbf921 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -211,6 +211,9 @@ Release 2.0.0 - UNRELEASED HADOOP-8243. Security support broken in CLI (manual) failover controller (todd) + HADOOP-6963. In FileUtil.getDU(..), neither include the size of directories + nor follow symbolic links. (Ravi Prakash via szetszwo) + BREAKDOWN OF HADOOP-7454 SUBTASKS HADOOP-7455. HA: Introduce HA Service Protocol Interface. (suresh) diff --git a/hadoop-common-project/hadoop-common/pom.xml b/hadoop-common-project/hadoop-common/pom.xml index 71dce5545b9..b0c22fc073c 100644 --- a/hadoop-common-project/hadoop-common/pom.xml +++ b/hadoop-common-project/hadoop-common/pom.xml @@ -77,6 +77,11 @@ commons-net compile + + commons-io + commons-io + compile + javax.servlet servlet-api diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java index 8e7aa302a61..ba9bb4eafee 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java @@ -483,11 +483,18 @@ public static long getDU(File dir) { if (!dir.isDirectory()) { return dir.length(); } else { - size = dir.length(); File[] allFiles = dir.listFiles(); if(allFiles != null) { for (int i = 0; i < allFiles.length; i++) { - size = size + getDU(allFiles[i]); + boolean isSymLink; + try { + isSymLink = org.apache.commons.io.FileUtils.isSymlink(allFiles[i]); + } catch(IOException ioe) { + isSymLink = true; + } + if(!isSymLink) { + size += getDU(allFiles[i]); + } } } return size; diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java index 65c43435b75..0b74baeb6e7 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java @@ -93,6 +93,9 @@ private void setupDirs() throws IOException { // create files in partitioned directories createFile(partitioned, "part-r-00000", "foo"); createFile(partitioned, "part-r-00001", "bar"); + + // create a cycle using symlinks. Cycles should be handled + FileUtil.symLink(del.toString(), dir1.toString() + "/cycle"); } /** @@ -458,4 +461,18 @@ private boolean copyMerge(String src, String dst) return result; } + + /** + * Test that getDU is able to handle cycles caused due to symbolic links + * and that directory sizes are not added to the final calculated size + * @throws IOException + */ + @Test + public void testGetDU() throws IOException { + setupDirs(); + + long du = FileUtil.getDU(TEST_DIR); + //Only two files (in partitioned) have 4 bytes each + Assert.assertEquals(du, 8); + } }