You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2013/05/23 01:12:46 UTC

svn commit: r1485492 - in /hbase/branches/0.94/src: main/java/org/apache/hadoop/hbase/filter/FilterList.java test/java/org/apache/hadoop/hbase/filter/TestFilter.java test/java/org/apache/hadoop/hbase/filter/TestFilterList.java

Author: tedyu
Date: Wed May 22 23:12:45 2013
New Revision: 1485492

URL: http://svn.apache.org/r1485492
Log:
HBASE-8555 FilterList correctness may be affected by random ordering of sub-filter(list) (Liang Xie)


Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
    hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilter.java
    hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilterList.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java?rev=1485492&r1=1485491&r2=1485492&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java Wed May 22 23:12:45 2013
@@ -149,20 +149,21 @@ public class FilterList implements Filte
 
   @Override
   public boolean filterRowKey(byte[] rowKey, int offset, int length) {
+    boolean flag = (this.operator == Operator.MUST_PASS_ONE) ? true : false;
     for (Filter filter : filters) {
       if (this.operator == Operator.MUST_PASS_ALL) {
         if (filter.filterAllRemaining() ||
             filter.filterRowKey(rowKey, offset, length)) {
-          return true;
+          flag = true;
         }
       } else if (this.operator == Operator.MUST_PASS_ONE) {
         if (!filter.filterAllRemaining() &&
             !filter.filterRowKey(rowKey, offset, length)) {
-          return false;
+          flag = false;
         }
       }
     }
-    return this.operator == Operator.MUST_PASS_ONE;
+    return flag;
   }
 
   @Override

Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilter.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilter.java?rev=1485492&r1=1485491&r2=1485492&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilter.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilter.java Wed May 22 23:12:45 2013
@@ -1225,6 +1225,100 @@ public class TestFilter extends HBaseTes
     verifyScanFull(s, kvs);
   }
 
+  public void testNestedFilterListWithSCVF() throws IOException {
+    byte[] columnStatus = Bytes.toBytes("S");
+    HTableDescriptor htd = new HTableDescriptor(getName());
+    htd.addFamily(new HColumnDescriptor(FAMILIES[0]));
+    HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
+    HRegion testRegion = HRegion.createHRegion(info, testDir, conf, htd);
+    for(int i=0; i<10; i++) {
+      Put p = new Put(Bytes.toBytes("row" + i));
+      p.setWriteToWAL(false);
+      p.add(FAMILIES[0], columnStatus, Bytes.toBytes(i%2));
+      testRegion.put(p);
+    }
+    testRegion.flushcache();
+    // 1. got rows > "row4"
+    Filter rowFilter = new RowFilter(CompareOp.GREATER, new BinaryComparator(
+        Bytes.toBytes("row4")));
+    Scan s1 = new Scan();
+    s1.setFilter(rowFilter);
+    InternalScanner scanner = testRegion.getScanner(s1);
+    List<KeyValue> results = new ArrayList<KeyValue>();
+    int i = 5;
+    for (boolean done = true; done; i++) {
+      done = scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    // 2. got rows <= "row4" and S=
+    FilterList subFilterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
+    Filter subFilter1 = new RowFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(
+        Bytes.toBytes("row4")));
+    subFilterList.addFilter(subFilter1);
+    Filter subFilter2 = new SingleColumnValueFilter(FAMILIES[0], columnStatus, CompareOp.EQUAL,
+        Bytes.toBytes(0));
+    subFilterList.addFilter(subFilter2);
+    s1 = new Scan();
+    s1.setFilter(subFilterList);
+    scanner = testRegion.getScanner(s1);
+    results = new ArrayList<KeyValue>();
+    for (i=0; i<=4; i+=2) {
+      scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    Assert.assertFalse(scanner.next(results));
+    // 3. let's begin to verify nested filter list
+    // 3.1 add rowFilter, then add subFilterList
+    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
+    filterList.addFilter(rowFilter);
+    filterList.addFilter(subFilterList);
+    s1 = new Scan();
+    s1.setFilter(filterList);
+    scanner = testRegion.getScanner(s1);
+    results = new ArrayList<KeyValue>();
+    for (i=0; i<=4; i+=2) {
+      scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    for (i=5; i<=9; i++) {
+      scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    Assert.assertFalse(scanner.next(results));
+    // 3.2 MAGIC here! add subFilterList first, then add rowFilter
+    filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
+    filterList.addFilter(subFilterList);
+    filterList.addFilter(rowFilter);
+    s1 = new Scan();
+    s1.setFilter(filterList);
+    scanner = testRegion.getScanner(s1);
+    results = new ArrayList<KeyValue>();
+    for (i=0; i<=4; i+=2) {
+      scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    for (i=5; i<=9; i++) {
+      scanner.next(results);
+      Assert.assertTrue(Bytes.equals(results.get(0).getRow(), Bytes.toBytes("row" + i)));
+      Assert.assertEquals(Bytes.toInt(results.get(0).getValue()), i%2);
+      results.clear();
+    }
+    Assert.assertFalse(scanner.next(results));
+    HLog hlog = testRegion.getLog();
+    testRegion.close();
+    hlog.closeAndDelete();
+  }
+
   public void testSingleColumnValueFilter() throws IOException {
 
     // From HBASE-1821

Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilterList.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilterList.java?rev=1485492&r1=1485491&r2=1485492&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilterList.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestFilterList.java Wed May 22 23:12:45 2013
@@ -79,33 +79,31 @@ public class TestFilterList extends Test
     byte [] rowkey = Bytes.toBytes("yyyyyyyyy");
     for (int i = 0; i < MAX_PAGES - 1; i++) {
       assertFalse(filterMPONE.filterRowKey(rowkey, 0, rowkey.length));
-      assertFalse(filterMPONE.filterRow());
       KeyValue kv = new KeyValue(rowkey, rowkey, Bytes.toBytes(i),
         Bytes.toBytes(i));
       assertTrue(Filter.ReturnCode.INCLUDE == filterMPONE.filterKeyValue(kv));
+      assertFalse(filterMPONE.filterRow());
     }
 
     /* Only pass PageFilter */
     rowkey = Bytes.toBytes("z");
     assertFalse(filterMPONE.filterRowKey(rowkey, 0, rowkey.length));
-    assertFalse(filterMPONE.filterRow());
     KeyValue kv = new KeyValue(rowkey, rowkey, Bytes.toBytes(0),
         Bytes.toBytes(0));
     assertTrue(Filter.ReturnCode.INCLUDE == filterMPONE.filterKeyValue(kv));
+    assertFalse(filterMPONE.filterRow());
 
-    /* PageFilter will fail now, but should pass because we match yyy */
+    /* reach MAX_PAGES already, should filter any rows */
     rowkey = Bytes.toBytes("yyy");
-    assertFalse(filterMPONE.filterRowKey(rowkey, 0, rowkey.length));
-    assertFalse(filterMPONE.filterRow());
+    assertTrue(filterMPONE.filterRowKey(rowkey, 0, rowkey.length));
     kv = new KeyValue(rowkey, rowkey, Bytes.toBytes(0),
         Bytes.toBytes(0));
-    assertTrue(Filter.ReturnCode.INCLUDE == filterMPONE.filterKeyValue(kv));
+    assertFalse(Filter.ReturnCode.INCLUDE == filterMPONE.filterKeyValue(kv));
 
     /* We should filter any row */
     rowkey = Bytes.toBytes("z");
     assertTrue(filterMPONE.filterRowKey(rowkey, 0, rowkey.length));
     assertTrue(filterMPONE.filterAllRemaining());
-
   }
 
   /**