You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2011/10/21 05:15:29 UTC
svn commit: r1187175 - in /hbase/trunk: ./
src/main/java/org/apache/hadoop/hbase/filter/
Author: larsh
Date: Fri Oct 21 03:15:28 2011
New Revision: 1187175
URL: http://svn.apache.org/viewvc?rev=1187175&view=rev
Log:
HBASE-4626 Filters unnecessarily copy byte arrays
Modified:
hbase/trunk/CHANGES.txt
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java
Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Oct 21 03:15:28 2011
@@ -21,6 +21,7 @@ Release 0.93.0 - Unreleased
HBASE-4469 Avoid top row seek by looking up bloomfilter (liyin via jgray)
HBASE-4418 Show all the hbase configuration in the web ui
HBASE-4489 Better key splitting in RegionSplitter
+ HBASE-4626 Filters unnecessarily copy byte arrays (Lars H)
BUG FIXES
HBASE-4488 Store could miss rows during flush (Lars H via jgray)
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java Fri Oct 21 03:15:28 2011
@@ -20,6 +20,8 @@
package org.apache.hadoop.hbase.filter;
+import org.apache.hadoop.hbase.util.Bytes;
+
/**
* A binary comparator which lexicographically compares against the specified
* byte array using {@link org.apache.hadoop.hbase.util.Bytes#compareTo(byte[], byte[])}.
@@ -37,4 +39,8 @@ public class BinaryComparator extends Wr
super(value);
}
+ @Override
+ public int compareTo(byte [] value, int offset, int length) {
+ return Bytes.compareTo(this.value, 0, this.value.length, value, offset, length);
+ }
}
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java Fri Oct 21 03:15:28 2011
@@ -41,13 +41,8 @@ public class BinaryPrefixComparator exte
}
@Override
- public int compareTo(byte [] value) {
- if (this.value.length <= value.length) {
- return Bytes.compareTo(this.value, 0, this.value.length, value, 0,
- this.value.length);
- } else {
- return Bytes.compareTo(this.value, value);
- }
+ public int compareTo(byte [] value, int offset, int length) {
+ return Bytes.compareTo(this.value, 0, this.value.length, value, offset,
+ this.value.length <= length ? this.value.length : length);
}
-
}
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java Fri Oct 21 03:15:28 2011
@@ -74,8 +74,8 @@ public class BitComparator extends Writa
}
@Override
- public int compareTo(byte[] value) {
- if (value.length != this.value.length) {
+ public int compareTo(byte[] value, int offset, int length) {
+ if (length != this.value.length) {
return 1;
}
int b = 0;
@@ -83,13 +83,13 @@ public class BitComparator extends Writa
for (int i = value.length - 1; i >= 0 && b == 0; i--) {
switch (bitOperator) {
case AND:
- b = (this.value[i] & value[i]) & 0xff;
+ b = (this.value[i] & value[i+offset]) & 0xff;
break;
case OR:
- b = (this.value[i] | value[i]) & 0xff;
+ b = (this.value[i] | value[i+offset]) & 0xff;
break;
case XOR:
- b = (this.value[i] ^ value[i]) & 0xff;
+ b = (this.value[i] ^ value[i+offset]) & 0xff;
break;
}
}
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java Fri Oct 21 03:15:28 2011
@@ -20,13 +20,11 @@
package org.apache.hadoop.hbase.filter;
-import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
-import java.util.Arrays;
import java.util.ArrayList;
import com.google.common.base.Preconditions;
@@ -102,12 +100,10 @@ public abstract class CompareFilter exte
protected boolean doCompare(final CompareOp compareOp,
final WritableByteArrayComparable comparator, final byte [] data,
final int offset, final int length) {
- if (compareOp == CompareOp.NO_OP) {
- return true;
- }
- int compareResult =
- comparator.compareTo(Arrays.copyOfRange(data, offset,
- offset + length));
+ if (compareOp == CompareOp.NO_OP) {
+ return true;
+ }
+ int compareResult = comparator.compareTo(data, offset, length);
switch (compareOp) {
case LESS:
return compareResult <= 0;
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java Fri Oct 21 03:15:28 2011
@@ -36,4 +36,8 @@ public class NullComparator extends Writ
return value != null ? 1 : 0;
}
+ @Override
+ public int compareTo(byte[] value, int offset, int length) {
+ throw new UnsupportedOperationException();
+ }
}
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java Fri Oct 21 03:15:28 2011
@@ -90,10 +90,11 @@ public class RegexStringComparator exten
}
@Override
- public int compareTo(byte[] value) {
+ public int compareTo(byte[] value, int offset, int length) {
// Use find() for subsequence match instead of matches() (full sequence
// match) to adhere to the principle of least surprise.
- return pattern.matcher(new String(value, charset)).find() ? 0 : 1;
+ return pattern.matcher(new String(value, offset, length, charset)).find() ? 0
+ : 1;
}
@Override
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java Fri Oct 21 03:15:28 2011
@@ -174,10 +174,7 @@ public class SingleColumnValueFilter ext
private boolean filterColumnValue(final byte [] data, final int offset,
final int length) {
- // TODO: Can this filter take a rawcomparator so don't have to make this
- // byte array copy?
- int compareResult =
- this.comparator.compareTo(Arrays.copyOfRange(data, offset, offset + length));
+ int compareResult = this.comparator.compareTo(data, offset, length);
switch (this.compareOp) {
case LESS:
return compareResult <= 0;
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java Fri Oct 21 03:15:28 2011
@@ -64,8 +64,9 @@ public class SubstringComparator extends
}
@Override
- public int compareTo(byte[] value) {
- return Bytes.toString(value).toLowerCase().contains(substr) ? 0 : 1;
+ public int compareTo(byte[] value, int offset, int length) {
+ return Bytes.toString(value, offset, length).toLowerCase().contains(substr) ? 0
+ : 1;
}
@Override
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java Fri Oct 21 03:15:28 2011
@@ -60,7 +60,17 @@ public abstract class WritableByteArrayC
@Override
public int compareTo(byte [] value) {
- return Bytes.compareTo(this.value, value);
+ return compareTo(value, 0, value.length);
}
+ /**
+ * Special compareTo method for subclasses, to avoid
+ * copying byte[] unnecessarily.
+ * @param value byte[] to compare
+ * @param offset offset into value
+ * @param length number of bytes to compare
+ * @return a negative integer, zero, or a positive integer as this object
+ * is less than, equal to, or greater than the specified object.
+ */
+ public abstract int compareTo(byte [] value, int offset, int length);
}