diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index a28f70116fc..cd7bea6edac 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/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-7770. ViewFS getFileChecksum throws FileNotFoundException for files in + /tmp and /user. (Ravi Prakash via jitendra) + Release 0.22.0 - Unreleased INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java index a08aa3d58d2..b156194928f 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java +++ b/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 { InodeTree.ResolveResult res = fsState.resolve(getUriPath(f), true); - return res.targetFileSystem.getFileChecksum(f); + return res.targetFileSystem.getFileChecksum(res.remainingPath); } @Override diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java index 484c041faf1..232a77074fa 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java +++ b/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 { InodeTree.ResolveResult res = fsState.resolve(getUriPath(f), true); - return res.targetFileSystem.getFileChecksum(f); + return res.targetFileSystem.getFileChecksum(res.remainingPath); } @Override diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java index 1a4d933fdb7..4a576d08ebf 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java +++ b/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 org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileChecksum; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; @@ -33,6 +34,8 @@ import org.apache.hadoop.io.DataOutputBuffer; import org.junit.AfterClass; import org.junit.Test; +import org.mockito.Mockito; + import static org.junit.Assert.*; /** @@ -81,6 +84,27 @@ public class TestViewfsFileStatus { 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 res = + new InodeTree.ResolveResult(null, mockFS , null, + new Path("someFile")); + @SuppressWarnings("unchecked") + InodeTree 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 public static void cleanup() throws IOException { FileUtil.fullyDelete(TEST_DIR); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsBaseTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsBaseTest.java index 1ea2a4b17ed..8622f02ff6b 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsBaseTest.java +++ b/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 org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.AbstractFileSystem; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.fs.FileContextTestHelper; +import org.apache.hadoop.fs.FileContextTestHelper.fileType; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FsConstants; 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.security.AccessControlException; import org.apache.hadoop.security.token.Token; @@ -43,6 +45,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; 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 res = + new InodeTree.ResolveResult(null, mockAFS , null, + new Path("someFile")); + @SuppressWarnings("unchecked") + InodeTree 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) public void testgetFSonDanglingLink() throws IOException { fcView.getFileStatus(new Path("/danglingLink"));