hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From zy...@apache.org
Subject hbase git commit: [HBASE-20141] Fix TooManyFiles exception when RefreshingChannels
Date Fri, 16 Mar 2018 17:55:09 GMT
Repository: hbase
Updated Branches:
  refs/heads/branch-2 79d47dd57 -> 6bf967adf


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

Branch: refs/heads/branch-2
Commit: 6bf967adfb53001365bf4f9d5a72a1e095ee2900
Parents: 79d47dd
Author: Zach York <zyork@amazon.com>
Authored: Wed Feb 28 10:40:38 2018 -0800
Committer: Zach York <zyork@amazon.com>
Committed: Fri Mar 16 10:54:43 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/6bf967ad/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/6bf967ad/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());
+  }
 }


Mime
View raw message