From c96d4ad6d112d69fac029ebb34eac6fbf5fe8076 Mon Sep 17 00:00:00 2001 From: Matt Warhaftig Date: Mon, 25 Apr 2016 19:30:27 -0400 Subject: [PATCH] HBASE-15676 Add processed flag to FuzzyRowFilter's mask. --- .../apache/hadoop/hbase/filter/FuzzyRowFilter.java | 30 +++++++-------- .../hbase/filter/TestFuzzyRowFilterEndToEnd.java | 43 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 17 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 500d01d..8beb027 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 @@ -82,6 +82,11 @@ public class FuzzyRowFilter extends FilterBase { for (int i = 0; i < fuzzyKeysData.size(); i++) { p = fuzzyKeysData.get(i); if (p.getFirst().length != p.getSecond().length) { + // Extra mask element with value of 2 is processed marker. + if (((p.getSecond().length - p.getFirst().length) == 1) + && p.getSecond()[p.getSecond().length - 1] == 2) { + continue; + } Pair readable = new Pair(Bytes.toStringBinary(p.getFirst()), Bytes.toStringBinary(p .getSecond())); @@ -119,24 +124,17 @@ public class FuzzyRowFilter extends FilterBase { // do nothing return mask; } - if (isPreprocessedMask(mask)) return mask; - for (int i = 0; i < mask.length; i++) { - if (mask[i] == 0) { - mask[i] = -1; // 0 -> -1 - } else if (mask[i] == 1) { - mask[i] = 0;// 1 -> 0 + if (mask[mask.length - 1] == 2) return mask; + byte[] processedMask = Arrays.copyOf(mask, mask.length + 1); + for (int i = 0; i < processedMask.length - 1; i++) { + if (processedMask[i] == 0) { + processedMask[i] = -1; // 0 -> -1 + } else if (processedMask[i] == 1) { + processedMask[i] = 0;// 1 -> 0 } } - return mask; - } - - private boolean isPreprocessedMask(byte[] mask) { - for (int i = 0; i < mask.length; i++) { - if (mask[i] != -1 && mask[i] != 0) { - return false; - } - } - return true; + processedMask[processedMask.length - 1] = 2; + return processedMask; } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java index cc09042..34f1b69 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java @@ -110,7 +110,48 @@ public class TestFuzzyRowFilterEndToEnd { // Nothing to do. } - @Test + // HBASE-15676 Test that fuzzy info of all fixed bits (0s) finds matching row. + @Test + public void testAllFixedBits() throws IOException { + String cf = "f"; + String cq = "q"; + String table = "testAllFixedBits"; + + 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", + "\\x9B\\x00\\x044e\\x9B\\x02\\xBB", "\\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("\\x9B\\x00\\x044e"); + byte[] mask = new byte[] { 0, 0, 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); + int total = 0; + while (scanner.next() != null) { + total++; + } + assertEquals(2, total); + TEST_UTIL.deleteTable(TableName.valueOf(table)); + } + + @Test public void testHBASE14782() throws IOException { String cf = "f"; -- 2.6.4 (Apple Git-63)