Index: src/main/java/org/apache/hadoop/hbase/regionserver/Leases.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/Leases.java (revision 1125501) +++ src/main/java/org/apache/hadoop/hbase/regionserver/Leases.java (working copy) @@ -189,7 +189,7 @@ // in a corrupt leaseQueue. if (lease == null || !leaseQueue.remove(lease)) { throw new LeaseException("lease '" + leaseName + - "' does not exist or has already expired"); + "' does not exist or has already expired"); } lease.setExpirationTime(System.currentTimeMillis() + leasePeriod); leaseQueue.add(lease); @@ -269,14 +269,5 @@ public void setExpirationTime(long expirationTime) { this.expirationTime = expirationTime; } - - /** - * Get the expiration time for that lease - * @return expiration time - */ - public long getExpirationTime() { - return this.expirationTime; - } - } -} +} \ No newline at end of file Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1125501) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -1911,26 +1911,26 @@ } public Result[] next(final long scannerId, int nbRows) throws IOException { + String scannerName = String.valueOf(scannerId); + InternalScanner s = this.scanners.get(scannerName); + if (s == null) throw new UnknownScannerException("Name: " + scannerName); try { - String scannerName = String.valueOf(scannerId); - InternalScanner s = this.scanners.get(scannerName); - if (s == null) { - throw new UnknownScannerException("Name: " + scannerName); - } + checkOpen(); + } catch (IOException e) { + // If checkOpen failed, server not running or filesystem gone, + // cancel this lease; filesystem is gone or we're closing or something. try { - checkOpen(); - } catch (IOException e) { - // If checkOpen failed, server not running or filesystem gone, - // cancel this lease; filesystem is gone or we're closing or something. - try { - this.leases.cancelLease(scannerName); - } catch (LeaseException le) { - LOG.info("Server shutting down and client tried to access missing scanner " + - scannerName); - } - throw e; + this.leases.cancelLease(scannerName); + } catch (LeaseException le) { + LOG.info("Server shutting down and client tried to access missing scanner " + + scannerName); } - this.leases.renewLease(scannerName); + throw e; + } + try { + // Cancel lease while its being processed in server; protects against case + // where processing of request takes > lease expiration time. + this.leases.cancelLease(scannerName); List results = new ArrayList(nbRows); long currentScanResultSize = 0; List values = new ArrayList(); @@ -1992,10 +1992,14 @@ : results.toArray(new Result[0]); } catch (Throwable t) { if (t instanceof NotServingRegionException) { - String scannerName = String.valueOf(scannerId); this.scanners.remove(scannerName); } throw convertThrowableToIOE(cleanup(t)); + } finally { + // We're done. On way out set lease period. + if (this.scanners.containsKey(scannerName)) { + this.leases.renewLease(scannerName); + } } }