Repository: hbase Updated Branches: refs/heads/master 13f3ba3ce -> aaa90d806
[HBASE-20141] Fix TooManyFiles exception when RefreshingChannels HBASE-19435 implements a fix for reopening file channels when they are unnexpected closed to avoid disabling the BucketCache. However, it was missed that the the channels might not actually be completely closed (the write or read channel might still be open (see https://docs.oracle.com/javase/7/docs/api/java/nio/channels/ClosedChannelException.html) This commit closes any open channels before creating a new channel. Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/aaa90d80 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/aaa90d80 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/aaa90d80 Branch: refs/heads/master Commit: aaa90d80690114ca3300084cdba977024b5a7fd5 Parents: 13f3ba3 Author: Zach York <zy...@amazon.com> Authored: Wed Feb 28 10:40:38 2018 -0800 Committer: Zach York <zy...@amazon.com> Committed: Fri Mar 16 10:51:39 2018 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/io/hfile/bucket/FileIOEngine.java | 13 +++++++++++-- .../hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java | 11 +++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/aaa90d80/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java index cf963f0..648d4bc 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java @@ -19,7 +19,6 @@ package org.apache.hadoop.hbase.io.hfile.bucket; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; @@ -274,7 +273,17 @@ public class FileIOEngine implements IOEngine { return fileNum; } - private void refreshFileConnection(int accessFileNum) throws FileNotFoundException { + @VisibleForTesting + FileChannel[] getFileChannels() { + return fileChannels; + } + + @VisibleForTesting + void refreshFileConnection(int accessFileNum) throws IOException { + FileChannel fileChannel = fileChannels[accessFileNum]; + if (fileChannel != null) { + fileChannel.close(); + } rafs[accessFileNum] = new RandomAccessFile(filePaths[accessFileNum], "rw"); fileChannels[accessFileNum] = rafs[accessFileNum].getChannel(); } http://git-wip-us.apache.org/repos/asf/hbase/blob/aaa90d80/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java index 5086265..6480986 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java @@ -18,10 +18,13 @@ package org.apache.hadoop.hbase.io.hfile.bucket; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.hbase.HBaseClassTestRule; @@ -138,4 +141,12 @@ public class TestFileIOEngine { ByteBuff data2 = deserializer.getDeserializedByteBuff(); assertArrayEquals(data1, data2.array()); } + + @Test + public void testRefreshFileConnectionClosesConnections() throws IOException { + FileChannel fileChannel = fileIOEngine.getFileChannels()[0]; + assertNotNull(fileChannel); + fileIOEngine.refreshFileConnection(0); + assertFalse(fileChannel.isOpen()); + } }