Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1549754) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -3794,7 +3794,7 @@ // KeyValue indicating that limit is reached when scanning private final KeyValue KV_LIMIT = new KeyValue(); private final byte [] stopRow; - private Filter filter; + private final Filter filter; private int batch; private int isScan; private boolean filterClosed = false; @@ -3986,7 +3986,7 @@ /* * @return True if a filter rules the scanner is over, done. */ - public synchronized boolean isFilterDone() { + public boolean isFilterDone() { return this.filter != null && this.filter.filterAllRemaining(); } Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1549754) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -2657,8 +2657,10 @@ } } if (bypass != null) { - return s.isFilterDone() && results.isEmpty() ? null - : results.toArray(new Result[0]); + synchronized(s) { + return s.isFilterDone() && results.isEmpty() ? null + : results.toArray(new Result[results.size()]); + } } } @@ -2699,8 +2701,10 @@ // If the scanner's filter - if any - is done with the scan // and wants to tell the client to stop the scan. This is done by passing // a null result. - return s.isFilterDone() && results.isEmpty() ? null - : results.toArray(new Result[0]); + synchronized(s) { + return s.isFilterDone() && results.isEmpty() ? null + : results.toArray(new Result[results.size()]); + } } catch (Throwable t) { if (t instanceof NotServingRegionException && scannerName != null) { this.scanners.remove(scannerName);