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) @@ -2642,6 +2642,7 @@ long currentScanResultSize = 0; List values = new ArrayList(); + boolean done = false; // Call coprocessor. Get region info from scanner. HRegion region = getRegion(s.getRegionInfo().getRegionName()); if (region != null && region.getCoprocessorHost() != null) { @@ -2657,8 +2658,10 @@ } } if (bypass != null) { - return s.isFilterDone() && results.isEmpty() ? null - : results.toArray(new Result[0]); + synchronized(s) { + done = s.isFilterDone() && results.isEmpty(); + } + return done ? null : results.toArray(new Result[results.size()]); } } @@ -2699,8 +2702,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) { + done = s.isFilterDone() && results.isEmpty(); + } + return done ? null : results.toArray(new Result[results.size()]); } catch (Throwable t) { if (t instanceof NotServingRegionException && scannerName != null) { this.scanners.remove(scannerName);