Repository: hbase
Updated Branches:
  refs/heads/branch-1.4 ac0fb1ce8 -> 51a35aafc


[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/51a35aaf
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/51a35aaf
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/51a35aaf

Branch: refs/heads/branch-1.4
Commit: 51a35aafcdac7954fd6aaaa851958851c13db417
Parents: ac0fb1c
Author: Zach York <[email protected]>
Authored: Wed Feb 28 10:40:38 2018 -0800
Committer: Zach York <[email protected]>
Committed: Fri Mar 16 11:02:58 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/51a35aaf/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/51a35aaf/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());
+  }
 }

Reply via email to