From 0253a23cd8f85b43b4fe4774537e938b761a78df Mon Sep 17 00:00:00 2001 From: chenheng Date: Thu, 12 Nov 2015 15:49:30 +0800 Subject: [PATCH] HBASE-14782 FuzzyRowFilter skips valid rows --- .../apache/hadoop/hbase/filter/FuzzyRowFilter.java | 4 +- .../hadoop/hbase/filter/TestFuzzyRowFilter.java | 80 ++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java index a9dd596..de8175b 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java @@ -152,9 +152,9 @@ public class FuzzyRowFilter extends FilterBase { return ReturnCode.INCLUDE; } } - // NOT FOUND -> seek next using hint + // NOT FOUND -> it means this row has been passed, so we jump to next row lastFoundIndex = -1; - return ReturnCode.SEEK_NEXT_USING_HINT; + return ReturnCode.NEXT_ROW; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilter.java index d420959..ee147d7 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilter.java @@ -17,15 +17,22 @@ */ package org.apache.hadoop.hbase.filter; +import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValueUtil; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.testclassification.FilterTests; import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; import org.junit.Assert; import org.junit.Test; import org.junit.experimental.categories.Category; +import java.util.ArrayList; +import java.util.List; + @Category({FilterTests.class, SmallTests.class}) public class TestFuzzyRowFilter { @Test @@ -467,4 +474,77 @@ public class TestFuzzyRowFilter { kv.getRowOffset(), kv.getRowLength(), fuzzyRow, mask); Assert.assertEquals(Bytes.toStringBinary(expected), Bytes.toStringBinary(nextForFuzzyRule)); } + + @Test + public void testFuzzyRowFilterFromClient() throws Exception { + HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + try { + TEST_UTIL.startMiniCluster(); + String table = "test"; + String cf = "f"; + String cq = "q"; + Table ht = + TEST_UTIL.createTable(TableName.valueOf(table), Bytes.toBytes(cf), Integer.MAX_VALUE); + // Load data + String[] rows = new String[]{ + "\\x9C\\x00\\x044\\x00\\x00\\x00\\x00", + "\\x9C\\x00\\x044\\x01\\x00\\x00\\x00", + "\\x9C\\x00\\x044\\x00\\x01\\x00\\x00", + "\\x9C\\x00\\x044\\x00\\x00\\x01\\x00", + "\\x9C\\x00\\x044\\x00\\x01\\x00\\x01", + "\\x9B\\x00\\x044e\\xBB\\xB2\\xBB", + }; + + for (int i = 0; i < rows.length; i++) { + Put p = new Put(Bytes.toBytesBinary(rows[i])); + p.addColumn(cf.getBytes(), cq.getBytes(), "value".getBytes()); + ht.put(p); + } + + TEST_UTIL.flush(); + + List> data = new ArrayList>(); + byte[] fuzzyKey = Bytes.toBytesBinary("\\x00\\x00\\x044"); + byte[] mask = new byte[]{1, 0, 0, 0}; + data.add(new Pair(fuzzyKey, mask)); + FuzzyRowFilter filter = new FuzzyRowFilter(data); + + Scan scan = new Scan(); + scan.setFilter(filter); + + ResultScanner scanner = ht.getScanner(scan); + try { + Result result = null; + + List results = new ArrayList(); + while ((result = scanner.next()) != null) { + results.add(Bytes.toStringBinary(result.getRow())); + } + Assert.assertEquals(6, results.size()); + } finally { + scanner.close(); + } + + String badRow = "\\x9C\\x00\\x03\\xE9e\\xBB{X\\x1Fwts\\x1F\\x15vRX"; + Put p = new Put(Bytes.toBytesBinary(badRow)); + p.addColumn(cf.getBytes(), cq.getBytes(), "value".getBytes()); + ht.put(p); + TEST_UTIL.flush(); + + scanner = ht.getScanner(scan); + try { + Result result = null; + List results = new ArrayList(); + while ((result = scanner.next()) != null) { + results.add(Bytes.toStringBinary(result.getRow())); + } + Assert.assertEquals(6, results.size()); + } finally { + scanner.close(); + } + } finally { + TEST_UTIL.shutdownMiniCluster(); + } + } + } -- 1.9.3 (Apple Git-50)