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:34:21 UTC
svn commit: r1576929 -
/hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Author: stack
Date: Wed Mar 12 21:34:20 2014
New Revision: 1576929
URL: http://svn.apache.org/r1576929
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/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Modified: hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1576929&r1=1576928&r2=1576929&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Wed Mar 12 21:34:20 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.
@@ -2769,18 +2772,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;
}