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 32f9d03e2..b243fd81e 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 @@ -1282,7 +1282,16 @@ public class RSRpcServices implements HBaseRPCErrorHandler, new ScannerListener(scannerName)); RegionScannerHolder rsh = new RegionScannerHolder(scannerName, s, r, needCursor); RegionScannerHolder existing = scanners.putIfAbsent(scannerName, rsh); - assert existing == null : "scannerId must be unique within regionserver's whole lifecycle!"; + if (existing != null) { + // leaving the assert for tests that relied on it + assert false : "scannerId must be unique within regionserver's whole lifecycle!"; + LOG.warn("ScannerId " + scannerName + " already exists!"); + try { + existing.s.close(); + } catch (IOException iox) { + LOG.warn("Getting exception closing " + scannerName, iox); + } + } return rsh; } @@ -3259,12 +3268,19 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } } RegionScannerHolder rsh = scanners.remove(scannerName); + scanner.close(); if (rsh != null) { - rsh.s.close(); + if (rsh.s != scanner) { + LOG.warn("Scanner name " + scannerName + " does not match the actual scanner used!"); + rsh.s.close(); + } if (region.getCoprocessorHost() != null) { region.getCoprocessorHost().postScannerClose(scanner); } closedScanners.put(scannerName, scannerName); + } else { + LOG.warn("Attempted to close scanner " + scannerName + ", but no related" + + " scanner found!"); } }