From 6c90507314be598cd53fa574f35e7d91402c956c Mon Sep 17 00:00:00 2001 From: tedyu Date: Fri, 11 Sep 2015 16:07:49 -0700 Subject: [PATCH] HBASE-14397 PrefixFilter doesn't filter all remaining rows if the prefix is longer than rowkey being compared (Jianwei Cui) --- .../java/org/apache/hadoop/hbase/filter/PrefixFilter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/PrefixFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/PrefixFilter.java index 8030ff60caf..8afe9c9a44e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/PrefixFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/PrefixFilter.java @@ -38,9 +38,11 @@ import java.util.ArrayList; @InterfaceAudience.Public @InterfaceStability.Stable public class PrefixFilter extends FilterBase { + public static final int MAX_SKIPPED_COMPARE_ROW_NUM = 100; protected byte [] prefix = null; protected boolean passedPrefix = false; protected boolean filterRow = true; + protected int skippedCompareRows = 0; public PrefixFilter(final byte [] prefix) { this.prefix = prefix; @@ -53,8 +55,12 @@ public class PrefixFilter extends FilterBase { public boolean filterRowKey(byte[] buffer, int offset, int length) { if (buffer == null || this.prefix == null) return true; - if (length < prefix.length) + if (length < prefix.length && skippedCompareRows < MAX_SKIPPED_COMPARE_ROW_NUM) { + ++skippedCompareRows; return true; + } + skippedCompareRows = 0; + // if they are equal, return false => pass row // else return true, filter row // if we are passed the prefix, set flag