diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java index 47e8dc8..c8249e8 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java @@ -47,6 +47,7 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -212,6 +213,9 @@ class ConnectionImplementation implements ClusterConnection, Closeable { */ private final String alternateBufferedMutatorClassName; + /** lock guards against multiple threads trying to query the meta region at the same time */ + private final ReentrantLock userRegionLock = new ReentrantLock(); + /** * constructor * @param conf Configuration object @@ -809,7 +813,14 @@ class ConnectionImplementation implements ClusterConnection, Closeable { // Query the meta region long pauseBase = this.pause; + userRegionLock.lock(); try { + if (useCache) {// re-check cache after get lock + RegionLocations locations = getCachedLocation(tableName, row); + if (locations != null && locations.getRegionLocation(replicaId) != null) { + return locations; + } + } Result regionInfoRow = null; s.resetMvccReadPoint(); s.setOneRowLimit(); @@ -899,6 +910,8 @@ class ConnectionImplementation implements ClusterConnection, Closeable { e instanceof NoServerForRegionException)) { relocateRegion(TableName.META_TABLE_NAME, metaKey, replicaId); } + } finally { + userRegionLock.unlock(); } try{ Thread.sleep(ConnectionUtils.getPauseTime(pauseBase, tries));