diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index bea8f45..5b7d41d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -4841,8 +4841,12 @@ public class HRegion implements HeapSize { // , Writable{ 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 { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 4d133c3..0e50509 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -931,11 +931,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, @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; @@ -975,6 +978,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, 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); + } + } } } @@ -1121,14 +1132,20 @@ public class RSRpcServices implements HBaseRPCErrorHandler, @QosPriority(priority = HConstants.HIGH_QOS) public MergeRegionsResponse mergeRegions(final RpcController controller, final MergeRegionsRequest request) throws ServiceException { + boolean regionAOpStarted = false; + boolean regionBOpStarted = false; + HRegion regionA = null; + HRegion regionB = null; try { checkOpen(); requestCount.increment(); - HRegion regionA = getRegion(request.getRegionA()); - HRegion regionB = getRegion(request.getRegionB()); + regionA = getRegion(request.getRegionA()); + regionB = getRegion(request.getRegionB()); boolean forcible = request.getForcible(); regionA.startRegionOperation(Operation.MERGE_REGION); + regionAOpStarted = true; regionB.startRegionOperation(Operation.MERGE_REGION); + regionBOpStarted = true; LOG.info("Receiving merging request for " + regionA + ", " + regionB + ",forcible=" + forcible); regionA.flushcache(); @@ -1137,6 +1154,21 @@ public class RSRpcServices implements HBaseRPCErrorHandler, return MergeRegionsResponse.newBuilder().build(); } catch (IOException ie) { throw new ServiceException(ie); + } finally { + if (regionAOpStarted) { + try { + regionA.closeRegionOperation(); + } catch (IOException ioe) { + LOG.warn("Error calling closeRegionOperation for A", ioe); + } + } + if (regionBOpStarted) { + try { + regionB.closeRegionOperation(); + } catch (IOException ioe) { + LOG.warn("Error calling closeRegionOperation for B", ioe); + } + } } } @@ -1443,11 +1475,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, @QosPriority(priority=HConstants.HIGH_QOS) public SplitRegionResponse splitRegion(final RpcController controller, final SplitRegionRequest 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.SPLIT_REGION); + regionOpStarted = true; LOG.info("Splitting " + region.getRegionNameAsString()); region.flushcache(); byte[] splitPoint = null; @@ -1459,6 +1494,14 @@ public class RSRpcServices implements HBaseRPCErrorHandler, return SplitRegionResponse.newBuilder().build(); } catch (IOException ie) { throw new ServiceException(ie); + } finally { + if (regionOpStarted) { + try { + region.closeRegionOperation(); + } catch (IOException ioe) { + LOG.warn("Error calling closeRegionOperation", ioe); + } + } } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java index f2519c2..177ff9b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java @@ -176,12 +176,16 @@ public class TableSnapshotScanner extends AbstractClientScanner { } } - 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; + } } } }