HBASE-13585 HRegionFileSystem#splitStoreFile() finishes without closing the 
file handle in some situation (Stephen Yuan Jiang)

Amending-Author: Andrew Purtell <[email protected]>

Conflicts:
        
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/368329de
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/368329de
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/368329de

Branch: refs/heads/0.98
Commit: 368329dec9d0c2fbed9ddd53ccf503ff892e62bc
Parents: 93ff195
Author: Enis Soztutar <[email protected]>
Authored: Tue Apr 28 17:27:46 2015 -0700
Committer: Andrew Purtell <[email protected]>
Committed: Mon May 11 16:08:36 2015 -0700

----------------------------------------------------------------------
 .../hbase/regionserver/HRegionFileSystem.java   | 44 ++++++++++----------
 1 file changed, 23 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/368329de/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
index 93fe52d..e1412c0 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
@@ -570,31 +570,33 @@ public class HRegionFileSystem {
     if (splitPolicy == null || !splitPolicy.skipStoreFileRangeCheck()) {
       // Check whether the split row lies in the range of the store file
       // If it is outside the range, return directly.
-      if (top) {
-        //check if larger than last key.
-        KeyValue splitKey = KeyValue.createFirstOnRow(splitRow);
-        byte[] lastKey = f.createReader().getLastKey();      
-        // If lastKey is null means storefile is empty.
-        if (lastKey == null) return null;
-        if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
-          splitKey.getKeyOffset(), splitKey.getKeyLength(), lastKey, 0, 
lastKey.length) > 0) {
-          return null;
-        }
-      } else {
-        //check if smaller than first key
-        KeyValue splitKey = KeyValue.createLastOnRow(splitRow);
-        byte[] firstKey = f.createReader().getFirstKey();
-        // If firstKey is null means storefile is empty.
-        if (firstKey == null) return null;
-        if (f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
-          splitKey.getKeyOffset(), splitKey.getKeyLength(), firstKey, 0, 
firstKey.length) < 0) {
-          return null;
+      try {
+        if (top) {
+          //check if larger than last key.
+          KeyValue splitKey = KeyValue.createFirstOnRow(splitRow);
+          byte[] lastKey = f.createReader().getLastKey();
+          // If lastKey is null means storefile is empty.
+          if (lastKey == null) return null;
+          if 
(f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
+            splitKey.getKeyOffset(), splitKey.getKeyLength(), lastKey, 0, 
lastKey.length) > 0) {
+            return null;
+          }
+        } else {
+          //check if smaller than first key
+          KeyValue splitKey = KeyValue.createLastOnRow(splitRow);
+          byte[] firstKey = f.createReader().getFirstKey();
+          // If firstKey is null means storefile is empty.
+          if (firstKey == null) return null;
+          if 
(f.getReader().getComparator().compareFlatKey(splitKey.getBuffer(),
+            splitKey.getKeyOffset(), splitKey.getKeyLength(), firstKey, 0, 
firstKey.length) < 0) {
+            return null;
+          }
         }
+      } finally {
+        f.closeReader(true);
       }
     }
 
-    f.closeReader(true);
-
     Path splitDir = new Path(getSplitsDir(hri), familyName);
     // A reference to the bottom half of the hsf store file.
     Reference r =

Reply via email to