diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/FileLink.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/FileLink.java index 8a79efb..09c2c04 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/FileLink.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/FileLink.java @@ -38,6 +38,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PositionedReadable; import org.apache.hadoop.fs.Seekable; import org.apache.hadoop.hbase.util.FSUtils; +import org.apache.hadoop.ipc.RemoteException; /** * The FileLink is a sort of hardlink, that allows access to a file given a set of locations. @@ -100,7 +101,7 @@ public class FileLink { * FileLink InputStream that handles the switch between the original path * and the alternative locations, when the file is moved. */ - private static class FileLinkInputStream extends InputStream + static class FileLinkInputStream extends InputStream implements Seekable, PositionedReadable, CanSetDropBehind, CanSetReadahead { private FSDataInputStream in = null; private Path currentPath = null; @@ -304,6 +305,9 @@ public class FileLink { return(in); } catch (FileNotFoundException e) { // Try another file location + } catch (RemoteException re) { + IOException ioe = re.unwrapRemoteException(FileNotFoundException.class); + if (!(ioe instanceof FileNotFoundException)) throw re; } } throw new FileNotFoundException("Unable to open link: " + fileLink); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java index 8ee7d3d..0349f0d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestFileLink.java @@ -37,7 +37,9 @@ import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.testclassification.IOTests; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.FSUtils; +import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.ipc.RemoteException; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -105,6 +107,31 @@ public class TestFileLink { } } + private static class MyDistributedFileSystem extends DistributedFileSystem { + MyDistributedFileSystem() { + } + @Override + public FSDataInputStream open(Path f, final int bufferSize) + throws IOException { + throw new RemoteException(FileNotFoundException.class.getName(), ""); + } + } + @Test(expected = FileNotFoundException.class) + public void testHDFSLinkRead() throws Exception { + HBaseTestingUtility testUtil = new HBaseTestingUtility(); + FileSystem fs = new MyDistributedFileSystem(); + + Path originalPath = new Path(testUtil.getDefaultRootDirPath(), "test.file"); + Path archivedPath = new Path(testUtil.getDefaultRootDirPath(), "archived.file"); + + List files = new ArrayList(); + files.add(originalPath); + files.add(archivedPath); + + FileLink link = new FileLink(files); + FileLink.FileLinkInputStream stream = new FileLink.FileLinkInputStream(fs, link, 1024); + } + /** * Test, on a local filesystem, that the FileLink is still readable * even when the current file gets renamed.