You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/08/23 15:48:39 UTC

svn commit: r1376489 - /hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Author: tedyu
Date: Thu Aug 23 13:48:39 2012
New Revision: 1376489

URL: http://svn.apache.org/viewvc?rev=1376489&view=rev
Log:
HBASE-5329 addRowLock() may allocate duplicate lock id, causing the client to be blocked (Ian Varley)


Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1376489&r1=1376488&r2=1376489&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Thu Aug 23 13:48:39 2012
@@ -51,6 +51,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -320,7 +321,7 @@ public class  HRegionServer implements C
   // Port we put up the webui on.
   protected int webuiport = -1;
 
-  Map<String, Integer> rowlocks = new ConcurrentHashMap<String, Integer>();
+  ConcurrentMap<String, Integer> rowlocks = new ConcurrentHashMap<String, Integer>();
 
   // A state before we go into stopped state.  At this stage we're closing user
   // space regions.
@@ -2753,11 +2754,13 @@ public class  HRegionServer implements C
     return this.fsOk;
   }
 
-  protected long addRowLock(Integer r, HRegion region)
-      throws LeaseStillHeldException {
-    long lockId = nextLong();
-    String lockName = String.valueOf(lockId);
-    rowlocks.put(lockName, r);
+  protected long addRowLock(Integer r, HRegion region) throws LeaseStillHeldException {
+    String lockName = null;
+    long lockId;
+    do {
+      lockId = nextLong();
+      lockName = String.valueOf(lockId);
+    } while (rowlocks.putIfAbsent(lockName, r) != null);
     this.leases.createLease(lockName, this.rowLockLeaseTimeoutPeriod, new RowLockListener(lockName,
         region));
     return lockId;