You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2013/11/02 19:18:20 UTC

svn commit: r1538243 - /hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java

Author: liyin
Date: Sat Nov  2 18:18:20 2013
New Revision: 1538243

URL: http://svn.apache.org/r1538243
Log:
[HBASE-2856] [0.89-fb] [trunk version] Clean up the scannerReadPoing if there is an exception.

Author: aaiyer

Summary:
Clean up the scannerReadPoing if there is an exception.
See also https://phabricator.fb.com/D1037580

Test Plan: push to shadow and test

Reviewers: liyintang

Reviewed By: liyintang

CC: hbase-eng@

Differential Revision: https://phabricator.fb.com/D1037582

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java?rev=1538243&r1=1538242&r2=1538243&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/RegionScanner.java Sat Nov  2 18:18:20 2013
@@ -102,23 +102,36 @@ public class RegionScanner implements In
 
     // synchronize on scannerReadPoints so that nobody calculates
     // getSmallestReadPoint, before scannerReadPoints is updated.
+    //
+    // TODO: "this" reference is escaping here. Refactor to move this logic
+    // out of constructor into an initialize method
     synchronized(scannerReadPoints) {
       this.readPt = MultiVersionConsistencyControl.resetThreadReadPoint(mvcc);
       scannerReadPoints.put(this, this.readPt);
     }
 
-    List<KeyValueScanner> scanners = new ArrayList<KeyValueScanner>();
-    if (additionalScanners != null) {
-      scanners.addAll(additionalScanners);
-    }
+    try {
+      List<KeyValueScanner> scanners = new ArrayList<KeyValueScanner>();
+      if (additionalScanners != null) {
+        scanners.addAll(additionalScanners);
+      }
 
-    for (Map.Entry<byte[], NavigableSet<byte[]>> entry :
-        scan.getFamilyMap().entrySet()) {
-      Store store = stores.get(entry.getKey());
-      StoreScanner scanner = store.getScanner(scan, entry.getValue());
-      scanners.add(scanner);
+      for (Map.Entry<byte[], NavigableSet<byte[]>> entry :
+          scan.getFamilyMap().entrySet()) {
+        Store store = stores.get(entry.getKey());
+        StoreScanner scanner = store.getScanner(scan, entry.getValue());
+        scanners.add(scanner);
+      }
+      this.storeHeap = new KeyValueHeap(scanners, comparator);
+    } catch (IOException ioe) {
+      LOG.warn("Caught exception while initializing region scanner.", ioe);
+      scannerReadPoints.remove(this);
+      throw ioe;
+    } catch (RuntimeException re) {
+      LOG.warn("Caught exception while initializing region scanner.", re);
+      scannerReadPoints.remove(this);
+      throw re;
     }
-    this.storeHeap = new KeyValueHeap(scanners, comparator);
   }
 
   /**