--- hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java 2014-05-31 15:24:52.000000000 -0700 +++ hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java 2014-06-20 10:13:21.000000000 -0700 @@ -178,12 +178,16 @@ } } - result = currentRegionScanner.next(); - if (result != null) { - return result; - } else { - currentRegionScanner.close(); - currentRegionScanner = null; + try { + result = currentRegionScanner.next(); + if (result != null) { + return result; + } + } finally { + if (result == null) { + currentRegionScanner.close(); + currentRegionScanner = null; + } } } } --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java 2014-05-31 15:24:52.000000000 -0700 +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java 2014-06-20 10:10:48.000000000 -0700 @@ -4892,8 +4892,12 @@ WALEdit walEdit = new WALEdit(); // 1. Run pre-process hook - processor.preProcess(this, walEdit); - + try { + processor.preProcess(this, walEdit); + } catch (IOException e) { + closeRegionOperation(); + throw e; + } // Short circuit the read only case if (processor.readOnly()) { try { --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 2014-05-31 15:24:52.000000000 -0700 +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 2014-06-20 10:15:32.000000000 -0700 @@ -3895,11 +3895,14 @@ @QosPriority(priority=HConstants.HIGH_QOS) public CompactRegionResponse compactRegion(final RpcController controller, final CompactRegionRequest request) throws ServiceException { + boolean regionOpStarted = false; + HRegion region = null; try { checkOpen(); requestCount.increment(); - HRegion region = getRegion(request.getRegion()); + region = getRegion(request.getRegion()); region.startRegionOperation(Operation.COMPACT_REGION); + regionOpStarted = true; LOG.info("Compacting " + region.getRegionNameAsString()); boolean major = false; byte [] family = null; @@ -3937,6 +3940,14 @@ return CompactRegionResponse.newBuilder().build(); } catch (IOException ie) { throw new ServiceException(ie); + } finally { + if (regionOpStarted) { + try { + region.closeRegionOperation(); + } catch (IOException ioe) { + LOG.warn("Error calling closeRegionOperation", ioe); + } + } } }