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/ecfa9a8a Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/ecfa9a8a Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/ecfa9a8a Branch: refs/heads/branch-1.3 Commit: ecfa9a8a7997a188c1f3ec2d7776245664dc7dbe Parents: 8bc84fd Author: Zach York <zy...@amazon.com> Authored: Wed Feb 28 10:40:38 2018 -0800 Committer: Andrew Purtell <apurt...@apache.org> Committed: Wed Dec 12 18:08:18 2018 -0800 ---------------------------------------------------------------------- .../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/ecfa9a8a/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 cb454d4..7b773bd 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; @@ -234,7 +233,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/ecfa9a8a/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 adf7fd0..8c2bc6e 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 @@ -19,10 +19,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; @@ -129,4 +132,12 @@ public class TestFileIOEngine { fileIOEngine.read(ByteBuffer.wrap(data2), offset); assertArrayEquals(data1, data2); } + + @Test + public void testRefreshFileConnectionClosesConnections() throws IOException { + FileChannel fileChannel = fileIOEngine.getFileChannels()[0]; + assertNotNull(fileChannel); + fileIOEngine.refreshFileConnection(0); + assertFalse(fileChannel.isOpen()); + } }