You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/05/14 20:13:42 UTC

svn commit: r944367 - in /hadoop/hbase/branches/0.20: CHANGES.txt src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java

Author: stack
Date: Fri May 14 18:13:41 2010
New Revision: 944367

URL: http://svn.apache.org/viewvc?rev=944367&view=rev
Log:
HBASE-2545 Unresponsive region server, potential deadlock

Modified:
    hadoop/hbase/branches/0.20/CHANGES.txt
    hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java
    hadoop/hbase/branches/0.20/src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java

Modified: hadoop/hbase/branches/0.20/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/CHANGES.txt?rev=944367&r1=944366&r2=944367&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.20/CHANGES.txt Fri May 14 18:13:41 2010
@@ -1,6 +1,8 @@
 HBase Change Log
-Release X.X.X - UNRELEASED
+Release 0.20.5
   BUG FIXES
+   HBASE-2545  Unresponsive region server, potential deadlock
+               (Todd Lipcon via Stack)
    HBASE-2521  no license headers in 5 files
 
 Release 0.20.4 - Mon May  3 16:16:02 PDT 2010

Modified: hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java?rev=944367&r1=944366&r2=944367&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (original)
+++ hadoop/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java Fri May 14 18:13:41 2010
@@ -83,8 +83,10 @@ public class ExplicitColumnTracker imple
    * @return MatchCode telling QueryMatcher what action to take
    */
   public MatchCode checkColumn(byte [] bytes, int offset, int length) {
-    boolean recursive = false;
+    boolean recursive;
     do {
+      recursive = false;
+
       // No more columns left, we are done with this query
       if(this.columns.size() == 0) {
         return MatchCode.DONE; // done_row

Modified: hadoop/hbase/branches/0.20/src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java?rev=944367&r1=944366&r2=944367&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java (original)
+++ hadoop/hbase/branches/0.20/src/test/org/apache/hadoop/hbase/regionserver/TestExplicitColumnTracker.java Fri May 14 18:13:41 2010
@@ -23,6 +23,7 @@ package org.apache.hadoop.hbase.regionse
 import java.util.ArrayList;
 import java.util.List;
 import java.util.TreeSet;
+import java.util.Arrays;
 
 import org.apache.hadoop.hbase.HBaseTestCase;
 import org.apache.hadoop.hbase.HConstants;
@@ -39,7 +40,33 @@ implements HConstants {
   private final byte [] col3 = Bytes.toBytes("col3");
   private final byte [] col4 = Bytes.toBytes("col4");
   private final byte [] col5 = Bytes.toBytes("col5");
-  
+ 
+  private void runTest(int maxVersions,
+                       TreeSet<byte[]> trackColumns,
+                       List<byte[]> scannerColumns,
+                       List<MatchCode> expected) {
+    ColumnTracker exp = new ExplicitColumnTracker(
+      trackColumns, maxVersions);
+
+
+    //Initialize result
+    List<MatchCode> result = new ArrayList<MatchCode>(); 
+    
+    //"Match"
+    for(byte [] col : scannerColumns){
+      result.add(exp.checkColumn(col, 0, col.length));
+    }
+    
+    assertEquals(expected.size(), result.size());
+    for(int i=0; i< expected.size(); i++){
+      assertEquals(expected.get(i), result.get(i));
+      if(PRINT){
+        System.out.println("Expected " +expected.get(i) + ", actual " +
+            result.get(i));
+      }
+    }
+  }
+
   public void testGet_SingleVersion(){
     if(PRINT){
       System.out.println("SingleVersion");
@@ -57,8 +84,6 @@ implements HConstants {
     expected.add(MatchCode.INCLUDE);
     expected.add(MatchCode.DONE);
     int maxVersions = 1;
-    
-    ColumnTracker exp = new ExplicitColumnTracker(columns, maxVersions);
         
     //Create "Scanner"
     List<byte[]> scanner = new ArrayList<byte[]>();
@@ -67,23 +92,8 @@ implements HConstants {
     scanner.add(col3);
     scanner.add(col4);
     scanner.add(col5);
-    
-    //Initialize result
-    List<MatchCode> result = new ArrayList<MatchCode>(); 
-    
-    //"Match"
-    for(byte [] col : scanner){
-      result.add(exp.checkColumn(col, 0, col.length));
-    }
-    
-    assertEquals(expected.size(), result.size());
-    for(int i=0; i< expected.size(); i++){
-      assertEquals(expected.get(i), result.get(i));
-      if(PRINT){
-        System.out.println("Expected " +expected.get(i) + ", actual " +
-            result.get(i));
-      }
-    }
+   
+    runTest(maxVersions, columns, scanner, expected);
   }
   
   public void testGet_MultiVersion(){
@@ -119,8 +129,6 @@ implements HConstants {
     expected.add(MatchCode.DONE);
     int maxVersions = 2;
     
-    ColumnTracker exp = new ExplicitColumnTracker(columns, maxVersions);
-        
     //Create "Scanner"
     List<byte[]> scanner = new ArrayList<byte[]>();
     scanner.add(col1);
@@ -140,21 +148,7 @@ implements HConstants {
     scanner.add(col5);
     
     //Initialize result
-    List<MatchCode> result = new ArrayList<MatchCode>(); 
-    
-    //"Match"
-    for(byte [] col : scanner){
-      result.add(exp.checkColumn(col, 0, col.length));
-    }
-    
-    assertEquals(expected.size(), result.size());
-    for(int i=0; i< expected.size(); i++){
-      assertEquals(expected.get(i), result.get(i));
-      if(PRINT){
-        System.out.println("Expected " +expected.get(i) + ", actual " +
-            result.get(i));
-      }
-    }
+    runTest(maxVersions, columns, scanner, expected);
   }
 
   /**
@@ -179,5 +173,21 @@ implements HConstants {
       explicit.checkColumn(col, 0, col.length);
     }
   }
+
+  /**
+   * Regression test for HBASE-2545
+   */
+  public void testInfiniteLoop() {
+    TreeSet<byte[]> columns = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
+    columns.addAll(Arrays.asList(new byte[][] {
+      col2, col3, col5 }));
+    List<byte[]> scanner = Arrays.<byte[]>asList(
+      new byte[][] { col1, col4 });
+    List<MatchCode> expected = Arrays.<MatchCode>asList(
+      new MatchCode[] {
+        MatchCode.SKIP,
+        MatchCode.SKIP });
+    runTest(1, columns, scanner, expected);
+  }
   
 }