Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1574770) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -43,6 +43,7 @@ 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 @@ private final Random rand; + private final AtomicLong scannerIdGen = new AtomicLong(0L); + /* * Strings to be used in forming the exception message for * RegionsAlreadyInTransitionException. @@ -2800,18 +2803,16 @@ } 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; }