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 =
