瀏覽代碼

Merged r1190532 from trunk for HADOOP-7770.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1190541 13f79535-47bb-0310-9956-ffa450edef68
Jitendra Nath Pandey 13 年之前
父節點
當前提交
3e0425d587

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -697,6 +697,9 @@ Release 0.23.0 - Unreleased
 
 
     HADOOP-7778. FindBugs warning in Token.getKind(). (tomwhite)
     HADOOP-7778. FindBugs warning in Token.getKind(). (tomwhite)
 
 
+    HADOOP-7770. ViewFS getFileChecksum throws FileNotFoundException for files in 
+    /tmp and /user. (Ravi Prakash via jitendra)
+
 Release 0.22.0 - Unreleased
 Release 0.22.0 - Unreleased
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 1 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java

@@ -318,7 +318,7 @@ public class ViewFileSystem extends FileSystem {
       IOException {
       IOException {
     InodeTree.ResolveResult<FileSystem> res = 
     InodeTree.ResolveResult<FileSystem> res = 
       fsState.resolve(getUriPath(f), true);
       fsState.resolve(getUriPath(f), true);
-    return res.targetFileSystem.getFileChecksum(f);
+    return res.targetFileSystem.getFileChecksum(res.remainingPath);
   }
   }
 
 
   @Override
   @Override

+ 1 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java

@@ -316,7 +316,7 @@ public class ViewFs extends AbstractFileSystem {
       UnresolvedLinkException, IOException {
       UnresolvedLinkException, IOException {
     InodeTree.ResolveResult<AbstractFileSystem> res = 
     InodeTree.ResolveResult<AbstractFileSystem> res = 
       fsState.resolve(getUriPath(f), true);
       fsState.resolve(getUriPath(f), true);
-    return res.targetFileSystem.getFileChecksum(f);
+    return res.targetFileSystem.getFileChecksum(res.remainingPath);
   }
   }
 
 
   @Override
   @Override

+ 24 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java

@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URISyntaxException;
 
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileChecksum;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.FileUtil;
 import org.apache.hadoop.fs.FileUtil;
@@ -33,6 +34,8 @@ import org.apache.hadoop.io.DataOutputBuffer;
 
 
 import org.junit.AfterClass;
 import org.junit.AfterClass;
 import org.junit.Test;
 import org.junit.Test;
+import org.mockito.Mockito;
+
 import static org.junit.Assert.*;
 import static org.junit.Assert.*;
 
 
 /**
 /**
@@ -81,6 +84,27 @@ public class TestViewfsFileStatus {
     assertEquals(content.length, deSer.getLen());
     assertEquals(content.length, deSer.getLen());
   }
   }
 
 
+  // Tests that ViewFileSystem.getFileChecksum calls res.targetFileSystem
+  // .getFileChecksum with res.remainingPath and not with f
+  @Test
+  public void testGetFileChecksum() throws IOException {
+    FileSystem mockFS = Mockito.mock(FileSystem.class);
+    InodeTree.ResolveResult<FileSystem> res =
+      new InodeTree.ResolveResult<FileSystem>(null, mockFS , null,
+        new Path("someFile"));
+    @SuppressWarnings("unchecked")
+    InodeTree<FileSystem> fsState = Mockito.mock(InodeTree.class);
+    Mockito.when(fsState.resolve("/tmp/someFile", true)).thenReturn(res);
+    ViewFileSystem vfs = Mockito.mock(ViewFileSystem.class);
+    vfs.fsState = fsState;
+
+    Mockito.when(vfs.getFileChecksum(new Path("/tmp/someFile")))
+      .thenCallRealMethod();
+    vfs.getFileChecksum(new Path("/tmp/someFile"));
+
+    Mockito.verify(mockFS).getFileChecksum(new Path("someFile"));
+  }
+
   @AfterClass
   @AfterClass
   public static void cleanup() throws IOException {
   public static void cleanup() throws IOException {
     FileUtil.fullyDelete(TEST_DIR);
     FileUtil.fullyDelete(TEST_DIR);

+ 25 - 1
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsBaseTest.java

@@ -29,13 +29,15 @@ import java.net.URI;
 import java.util.List;
 import java.util.List;
 
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.AbstractFileSystem;
 import org.apache.hadoop.fs.BlockLocation;
 import org.apache.hadoop.fs.BlockLocation;
 import org.apache.hadoop.fs.FileContext;
 import org.apache.hadoop.fs.FileContext;
 import org.apache.hadoop.fs.FileContextTestHelper;
 import org.apache.hadoop.fs.FileContextTestHelper;
+import org.apache.hadoop.fs.FileContextTestHelper.fileType;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FsConstants;
 import org.apache.hadoop.fs.FsConstants;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.fs.FileContextTestHelper.fileType;
+import org.apache.hadoop.fs.UnresolvedLinkException;
 import org.apache.hadoop.fs.viewfs.ViewFs.MountPoint;
 import org.apache.hadoop.fs.viewfs.ViewFs.MountPoint;
 import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.security.token.Token;
@@ -43,6 +45,7 @@ import org.junit.After;
 import org.junit.Assert;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 
 
 
 /**
 /**
@@ -408,6 +411,27 @@ public class ViewFsBaseTest {
     }
     }
   }
   }
   
   
+  @Test
+  public void testGetFileChecksum() throws AccessControlException
+    , UnresolvedLinkException, IOException {
+    AbstractFileSystem mockAFS = Mockito.mock(AbstractFileSystem.class);
+    InodeTree.ResolveResult<AbstractFileSystem> res =
+      new InodeTree.ResolveResult<AbstractFileSystem>(null, mockAFS , null,
+        new Path("someFile"));
+    @SuppressWarnings("unchecked")
+    InodeTree<AbstractFileSystem> fsState = Mockito.mock(InodeTree.class);
+    Mockito.when(fsState.resolve(Mockito.anyString()
+      , Mockito.anyBoolean())).thenReturn(res);
+    ViewFs vfs = Mockito.mock(ViewFs.class);
+    vfs.fsState = fsState;
+
+    Mockito.when(vfs.getFileChecksum(new Path("/tmp/someFile")))
+      .thenCallRealMethod();
+    vfs.getFileChecksum(new Path("/tmp/someFile"));
+
+    Mockito.verify(mockAFS).getFileChecksum(new Path("someFile"));
+  }
+
   @Test(expected=FileNotFoundException.class) 
   @Test(expected=FileNotFoundException.class) 
   public void testgetFSonDanglingLink() throws IOException {
   public void testgetFSonDanglingLink() throws IOException {
     fcView.getFileStatus(new Path("/danglingLink"));
     fcView.getFileStatus(new Path("/danglingLink"));