Author: stack
Date: Fri Jul 17 04:39:34 2009
New Revision: 794958

URL: http://svn.apache.org/viewvc?rev=794958&view=rev
Log:
HBASE-1609 We wait on leases to expire before regionserver goes down. Rather, 
just let client fail

Modified:
    hadoop/hbase/branches/0.19/CHANGES.txt
    
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/UnknownScannerException.java
    
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Modified: hadoop/hbase/branches/0.19/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/CHANGES.txt?rev=794958&r1=794957&r2=794958&view=diff
==============================================================================
--- hadoop/hbase/branches/0.19/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.19/CHANGES.txt Fri Jul 17 04:39:34 2009
@@ -24,6 +24,8 @@
                is shutdown
    HBASE-1664  Disable 1058 on catalog tables
    HBASE-1583  Start/Stop of large cluster untenable
+   HBASE-1609  We wait on leases to expire before regionserver goes down.
+               Rather, just let client fail
 
 Release 0.19.3 - May 27th, 2009
   BUG FIXES

Modified: 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/UnknownScannerException.java
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/UnknownScannerException.java?rev=794958&r1=794957&r2=794958&view=diff
==============================================================================
--- 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/UnknownScannerException.java
 (original)
+++ 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/UnknownScannerException.java
 Fri Jul 17 04:39:34 2009
@@ -21,7 +21,10 @@
 
 
 /**
- * Thrown if a region server is passed an unknown scanner id
+ * Thrown if a region server is passed an unknown scanner id.
+ * Usually means the client has take too long between checkins and so the
+ * scanner lease on the serverside has expired OR the serverside is closing
+ * down and has cancelled all leases.
  */
 public class UnknownScannerException extends DoNotRetryIOException {
   private static final long serialVersionUID = 993179627856392526L;

Modified: 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=794958&r1=794957&r2=794958&view=diff
==============================================================================
--- 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
 (original)
+++ 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
 Fri Jul 17 04:39:34 2009
@@ -33,7 +33,6 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.regex.Pattern;
@@ -209,7 +208,6 @@
     new ReentrantReadWriteLock();
   private final Integer splitLock = new Integer(0);
   private long minSequenceId;
-  final AtomicInteger activeScannerCount = new AtomicInteger(0);
 
   
//////////////////////////////////////////////////////////////////////////////
   // Constructor
@@ -420,19 +418,6 @@
       }
       newScannerLock.writeLock().lock();
       try {
-        // Wait for active scanners to finish. The write lock we hold will
-        // prevent new scanners from being created.
-        synchronized (activeScannerCount) {
-          while (activeScannerCount.get() != 0) {
-            LOG.debug("waiting for " + activeScannerCount.get() +
-                " scanners to finish");
-            try {
-              activeScannerCount.wait();
-            } catch (InterruptedException e) {
-              // continue
-            }
-          }
-        }
         splitsAndClosesLock.writeLock().lock();
         LOG.debug("Updates disabled for region, no outstanding scanners on " +
           this);
@@ -2037,10 +2022,6 @@
           closeScanner(i);
         }
       }
-
-      // As we have now successfully completed initialization, increment the
-      // activeScanner count.
-      activeScannerCount.incrementAndGet();
     }
 
     @SuppressWarnings("null")
@@ -2161,24 +2142,9 @@
     }
 
     public void close() {
-      try {
-        for(int i = 0; i < scanners.length; i++) {
-          if(scanners[i] != null) {
-            closeScanner(i);
-          }
-        }
-      } finally {
-        synchronized (activeScannerCount) {
-          int count = activeScannerCount.decrementAndGet();
-          if (count < 0) {
-            LOG.error("active scanner count less than zero: " + count +
-                " resetting to zero");
-            activeScannerCount.set(0);
-            count = 0;
-          }
-          if (count == 0) {
-            activeScannerCount.notifyAll();
-          }
+      for(int i = 0; i < scanners.length; i++) {
+        if(scanners[i] != null) {
+          closeScanner(i);
         }
       }
     }

Modified: 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=794958&r1=794957&r2=794958&view=diff
==============================================================================
--- 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 (original)
+++ 
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 Fri Jul 17 04:39:34 2009
@@ -1420,7 +1420,16 @@
     } finally {
       this.lock.writeLock().unlock();
     }
-    for(HRegion region: regionsToClose) {
+    // Close any outstanding scanners.  Means they'll get an UnknownScanner
+    // exception next time they come in.
+    for (Map.Entry<String, InternalScanner> e: this.scanners.entrySet()) {
+      try {
+        e.getValue().close();
+      } catch (IOException ioe) {
+        LOG.warn("Closing scanner " + e.getKey(), ioe);
+      }
+    }
+    for (HRegion region: regionsToClose) {
       if (LOG.isDebugEnabled()) {
         LOG.debug("closing region " + Bytes.toString(region.getRegionName()));
       }
@@ -1574,15 +1583,22 @@
   }
 
   public RowResult[] next(final long scannerId, int nbRows) throws IOException 
{
-    checkOpen();
-    ArrayList<RowResult> resultSets = new ArrayList<RowResult>();
     try {
       String scannerName = String.valueOf(scannerId);
       InternalScanner s = scanners.get(scannerName);
       if (s == null) {
         throw new UnknownScannerException("Name: " + scannerName);
       }
+      try {
+        checkOpen();
+      } catch (IOException e) {
+        // If checkOpen failed, cancel this lease; filesystem is gone or we're
+        // closing or something.
+        this.leases.cancelLease(scannerName);
+        throw e;
+      }
       this.leases.renewLease(scannerName);
+      List<RowResult> resultSets = new ArrayList<RowResult>();
       for(int i = 0; i < nbRows; i++) {
         requestCount.incrementAndGet();
         // Collect values to be returned here


Reply via email to