diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index d45387b3553..c14665597c3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -281,7 +281,7 @@ public class HRegionServer implements ClientProtocol, // Compactions public CompactSplitThread compactSplitThread; - final Map scanners = + final ConcurrentHashMap scanners = new ConcurrentHashMap(); /** @@ -2818,11 +2818,18 @@ public class HRegionServer implements ClientProtocol, } protected long addScanner(RegionScanner s) throws LeaseStillHeldException { - long scannerId = nextLong(); - String scannerName = String.valueOf(scannerId); - scanners.put(scannerName, s); - this.leases.createLease(scannerName, this.scannerLeaseTimeoutPeriod, new ScannerListener( - scannerName)); + long scannerId = -1; + while (true) { + scannerId = rand.nextLong(); + if (scannerId == -1) continue; + String scannerName = String.valueOf(scannerId); + RegionScanner existing = scanners.putIfAbsent(scannerName, s); + if (existing == null) { + this.leases.createLease(scannerName, this.scannerLeaseTimeoutPeriod, + new ScannerListener(scannerName)); + break; + } + } return scannerId; }