You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2014/03/12 22:33:55 UTC

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

Author: stack
Date: Wed Mar 12 21:33:55 2014
New Revision: 1576928

URL: http://svn.apache.org/r1576928
Log:
HBASE-10679 Both clients get wrong scan results if the first scanner expires and the second scanner is created with the same scannerId on the same region

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=1576928&r1=1576927&r2=1576928&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 Wed Mar 12 21:33:55 2014
@@ -43,6 +43,7 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListMap;
@@ -256,6 +257,8 @@ public class HRegionServer implements Cl
 
   private final Random rand;
 
+  private final AtomicLong scannerIdGen = new AtomicLong(0L);
+
   /*
    * Strings to be used in forming the exception message for
    * RegionsAlreadyInTransitionException.
@@ -2801,18 +2804,16 @@ public class HRegionServer implements Cl
   }
 
   protected long addScanner(RegionScanner s, HRegion r) throws LeaseStillHeldException {
-    long scannerId = -1;
-    while (true) {
-      scannerId = Math.abs(rand.nextLong() << 24) ^ startcode;
-      String scannerName = String.valueOf(scannerId);
-      RegionScannerHolder existing =
-        scanners.putIfAbsent(scannerName, new RegionScannerHolder(s, r));
-      if (existing == null) {
-        this.leases.createLease(scannerName, this.scannerLeaseTimeoutPeriod,
-          new ScannerListener(scannerName));
-        break;
-      }
-    }
+    long scannerId = this.scannerIdGen.incrementAndGet();
+    String scannerName = String.valueOf(scannerId);
+
+    RegionScannerHolder existing =
+      scanners.putIfAbsent(scannerName, new RegionScannerHolder(s, r));
+    assert existing == null : "scannerId must be unique within regionserver's whole lifecycle!";
+
+    this.leases.createLease(scannerName, this.scannerLeaseTimeoutPeriod,
+        new ScannerListener(scannerName));
+
     return scannerId;
   }