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 2ca1eb0..8f5bbae 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 @@ -5180,6 +5180,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi private long readPt; private long maxResultSize; protected HRegion region; + protected IsolationLevel isolationLevel; @Override public HRegionInfo getRegionInfo() { @@ -5209,12 +5210,15 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi // synchronize on scannerReadPoints so that nobody calculates // getSmallestReadPoint, before scannerReadPoints is updated. - IsolationLevel isolationLevel = scan.getIsolationLevel(); - synchronized(scannerReadPoints) { - this.readPt = getReadpoint(isolationLevel); - scannerReadPoints.put(this, this.readPt); + isolationLevel = scan.getIsolationLevel(); + if (isolationLevel == IsolationLevel.READ_UNCOMMITTED) // READ_UNCOMMITED NON BLOCKING + this.readPt = getReadpoint(isolationLevel); + else { // Synchronize READ_COMMITTED ACCESS + synchronized (scannerReadPoints) { + this.readPt = getReadpoint(isolationLevel); + scannerReadPoints.put(this, this.readPt); + } } - // Here we separate all scanners into two lists - scanner that provide data required // by the filter to operate (scanners list) and all others (joinedScanners list). List scanners = new ArrayList(); @@ -5705,7 +5709,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi joinedHeap = null; } // no need to synchronize here. - scannerReadPoints.remove(this); + if (this.isolationLevel != IsolationLevel.READ_UNCOMMITTED) + scannerReadPoints.remove(this); this.filterClosed = true; }