Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1549758) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -3526,7 +3526,7 @@ // KeyValue indicating that limit is reached when scanning private final KeyValue KV_LIMIT = new KeyValue(); protected final byte[] stopRow; - private Filter filter; + private final Filter filter; private int batch; protected int isScan; private boolean filterClosed = false; @@ -3725,7 +3725,7 @@ * @return True if a filter rules the scanner is over, done. */ @Override - public synchronized boolean isFilterDone() throws IOException { + public boolean isFilterDone() throws IOException { return this.filter != null && this.filter.filterAllRemaining(); } Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1549758) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -3152,7 +3152,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, and setting moreResults to false. - if (scanner.isFilterDone() && results.isEmpty()) { + synchronized(scanner) { + done = scanner.isFilterDone() && results.isEmpty(); + } + if (done) { moreResults = false; results = null; } else {